2012-01-10 71 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,這可能會或可能不會提供您想要的(不知道你需要它做什麼)的行爲。

相關問題