问题: 我使用全局常量STORE_DATA_ENABLED来启用我写的模块(StoreData): 例如:
STORE_DATA_ENABLED = false
...
module StoreData
def a
return unless STORE_DATA_ENABLED
...
end
def b
return unless STORE_DATA_ENABLED
...
end
def c
return unless STORE_DATA_ENABLED
...
end
...
end
我认为有一种方法可以在不检查模块中的所有方法的情况下禁用模块。 干这个代码的想法吗?
答案 0 :(得分:1)
使用before_filter
。在模块中的每个方法调用之前调用它:
module StoreData
before_filter :store_data_enabled
def a
...
end
private
def store_data_enabled
STORE_DATA_ENABLED # return implicit true/false
end
end
编辑:仅用于红宝石的方法。这使用模块初始值设定项重新创建模块中的所有公共方法,并使它们返回nil
。当你的方法中有参数时,我没有尝试这种行为。
module M
# this is called while module init
def self.included(base)
unless STORE_DATA_ENABLED
# iterate over public methods of this instance
public_instance_methods.each do |m|
# overwrite all methods, does not care about arguments
define_method(m) { return nil }
end
end
end
def a
...
end
end