1
我想在Ruby脚本中禁用FileUtils
模块的rm\_rf
方法。如何在守护程序中添加方法/模块访问控制?
当foo.rb
包含:
FileUtils.rm_rf(file)
它不应该被运行:
Daemons.run("foo.rb", some_options)
,应该给出错误信息来代替。
请问Daemons
可以做到这一点吗?或者其他一些图书馆可以简单而有效地做到这一点?
我想在Ruby脚本中禁用FileUtils
模块的rm\_rf
方法。如何在守护程序中添加方法/模块访问控制?
当foo.rb
包含:
FileUtils.rm_rf(file)
它不应该被运行:
Daemons.run("foo.rb", some_options)
,应该给出错误信息来代替。
请问Daemons
可以做到这一点吗?或者其他一些图书馆可以简单而有效地做到这一点?
下面简要介绍一下你想做什么。
使用alias_method
可能不是一个好主意,除非您将旧方法定义为其他方法;这里的方法被定义了。这种方法的危险在于内部行为可能会以预期的方式受到影响,例如,允许的方法在内部使用不允许的方法。
以下是针对singleton(类)方法的情况,相同的逻辑可用于实例方法。有几个这种方式可以实施,这只是一个,意味着作为一个指导。
> 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,这可能会或可能不会提供您想要的(不知道你需要它做什么)的行为。
你不需要一个库,只需将它重新定义为no-op即可。 – 2012-01-10 11:34:05
@DaveNewton我可以有一个允许列表,然后禁用所有模块的所有其他方法? – nttstar 2012-01-10 11:57:46
当然;获取所有方法,拒绝列表中的方法,重新定义剩下的方法。 – 2012-01-10 12:14:31