Как добавить методы / модули контроля доступа в Daemons? - PullRequest
1 голос
/ 10 января 2012

Я хочу отключить метод rm\_rf модуля FileUtils в сценариях Ruby.

Когда foo.rb содержит:

FileUtils.rm_rf(file)

Он не должен управляться:

Daemons.run("foo.rb", some_options)

и вместо этого должно выдаваться сообщение об ошибке.

Может ли Daemons сделать это? Или другие библиотеки могут сделать это просто и эффективно?

1 Ответ

2 голосов
/ 10 января 2012

Вот примерный план того, что вы хотите сделать.

Использование alias_method, вероятно, не очень хорошая идея, если вы не определите старый метод для чего-то другого;здесь методы определены далеко.Опасность такого подхода заключается в том, что внутреннее поведение может подвергаться воздействию ожидаемыми способами, например, разрешенный метод использует запрещенный метод внутри.

Ниже приведено описание для одноэлементных (классовых) методов, та же логика может использоваться дляметоды экземпляра.Есть несколько способов, которыми это может быть реализовано, это только один, обозначенный как руководство.

> FileUtils.pwd
=> "/home/dave"
> FileUtils.cp '.bashrc', 'tmpbashrc'
=> nil
> class Object
*   def deimplement_singleton_methods *methods
*     methods.each do |msym|
*       define_singleton_method msym do |*args|
*         raise NotImplementedError.new "#{msym} not implemented"
*       end
*     end
*   end
* end
> FileUtils.deimplement_singleton_methods :cp
> FileUtils.pwd
=> "/home/dave"
> FileUtils.cp '.bashrc', 'tmpbashrc'
NotImplementedError: cp not implemented
from (pry):10:in `block (2 levels) in deimplement_singleton_methods'

Также есть Module :: undef_method и Module :: remove_method , который может или не может обеспечить поведение, которое вы хотите (не уверен, что вам нужно сделать).

...