如何让其他模块包含的模块在包含模块内查找常量?换句话说,我怎样才能让B.foo
和D.foo
给出预期的结果?查看调用原始模块的模块
module A
module_function
public
def foo; C end
end
module B
extend A
C = "foo in B"
end
module D
extend A
C = "foo in D"
end
B.foo #=> (Expected) "foo in B"
D.foo #=> (Expected) "foo in D"
感谢您的回答。你能解释为什么'module_function'是不必要的吗? – sawa 2012-03-03 23:19:53
@sawa,因为当你调用['Object#extend'](http://ruby-doc.org/core-1.9.3/Object.html#method-i-extend)时,你正在添加实例方法模块作为参数传递给接收器。如果接收者是一个Module对象,它的实例方法实际上就是“类方法”。 'module_function'使得它的方法被定义为模块的单例类(metaclass)上的实例方法。 – 2012-03-03 23:26:47
@sawa据我所知,如果你打算在某个时候重新定义'A.foo','module_function'只会改变行为。而且也只有在模块混入类时才可能,而不是另一个模块。虽然我不是100%确定,因为我没有任何使用它的经验和[docs](http://www.ruby-doc.org/docs/ProgrammingRuby/html/ref_c_module.html#Module .module_function)没有特别的启发性。 (@MatheusMoreira先回复,我会顺从他) – 2012-03-03 23:28:00