2012-01-10 33 views
1

我想在Ruby脚本中禁用FileUtils模块的rm\_rf方法。如何在守护程序中添加方法/模块访问控制?

foo.rb包含:

FileUtils.rm_rf(file) 

它不应该被运行:

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

,应该给出错误信息来代替。

请问Daemons可以做到这一点吗?或者其他一些图书馆可以简单而有效地做到这一点?

+2

你不需要一个库,只需将它重新定义为no-op即可。 – 2012-01-10 11:34:05

+0

@DaveNewton我可以有一个允许列表,然后禁用所有模块的所有其他方法? – nttstar 2012-01-10 11:57:46

+0

当然;获取所有方法,拒绝列表中的方法,重新定义剩下的方法。 – 2012-01-10 12:14:31

回答

2

下面简要介绍一下你想做什么。

使用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_methodModule::remove_method,这可能会或可能不会提供您想要的(不知道你需要它做什么)的行为。

相关问题