注意:这个问题已经在https://www.ruby-forum.com/topic/6876455上发布了,没有得到答案。
考虑一下这个模块:
module MM
def f
end
def self.g
end
module_function :f
endf和g都是模块函数,可以称为
MM::f
MM::g这仅仅是品味问题,还是有充分的理由选择一种定义模块功能的方式而另一种方式呢?
我意识到,当我将模块用作混合器时,两者之间存在差异:
class CC
include MM
end在这种情况下,f也可以作为CC中的实例方法使用,而g则不能。然而,在我看来,这并不是一个非常有趣的特性:如果我设计一个模块作为类的混合器,我就不明白为什么要使用module_function。在定义模块函数时,我会喜欢self.FUNCTION或module_function,还有其他原因吗?
发布于 2015-09-28 11:20:32
来自文档
module_function为命名方法创建模块函数。这些函数可以以模块作为接收方调用,也可以作为实例方法用于混合在模块中的类。模块函数是原始函数的副本,因此可以独立修改。实例方法版本是私有的。如果在没有参数的情况下使用,则随后定义的方法将成为模块函数。
基本上,module_function是使用模块方法的一种方式,无需将模块混入到类中。
区别在于,如果混合使用module_function的模块,混合方法将成为私有实例方法(但它们将是声明模块的公共类方法)。因此,在您的示例中,当模块f被混合到类CC时,MM变成了私有实例方法,但也可以用作:MM.f。
当你有:
module MM
def f
end
module_function :f
end然后,您可以使用MM.f,而无需将MM模块混合到CC类中。但是,如果你不使用
module_function :f始终可以使用以下方法将模块MM混入到CC类中:
class CC
include MM
end并可以使用方法f作为CC类对象的实例方法。
总的来说,您没有更好的理由使用module_function。如果您希望将模块方法作为类的实例方法,那么只需将模块包含到类中(混合模块到类中),如上面的示例所示。
此外,在定义static/utility方法时,您应该这样做:
module MM
def self.g
end
end或者你甚至可以这样做:
module MM
extend self
def g
end
end然后使用这样的方法:没有混合模块的MM.g。因此,您实际上不需要使用module_function。
https://stackoverflow.com/questions/32821237
复制相似问题