注意:此问题已在Ruby-Forum发布,但没有得到答案
考虑这个模块:
module MM
def f
end
def self.g
end
module_function :f
end
f
和g
都是模块函数,可以称为
MM::f
MM::g
这只是一个品味问题,还是有充分理由选择 一种定义模块功能的方法是什么?
我知道,当我使用模块时,是的区别 一个混音:
class CC
include MM
end
在这种情况下,f
也可用作CC
中的实例方法
g
不是。但是,这并不是我特别关注的
有趣的特点:如果我设计一个模块用作mixin
上课时,我不知道为什么我会使用module_function。还有其他吗?
我赞成self.FUNCTION
或module_function
的原因
在定义模块函数时?
答案 0 :(得分:2)
来自Doc:
module_function 为命名方法创建模块函数。这些功能可能是 使用模块作为接收器调用,也可以作为 实例方法到模块中混合的类。模块功能 是原件的副本,因此可以单独更改。的的 实例方法版本是私有的。如果没有参数使用, 随后定义的方法成为模块函数。
基本上, module_function 是一种使用模块方法而无需将模块混合到类中的方法。
不同之处在于,如果混合使用module_function
的模块,混合方法将成为私有实例方法(但它们将是声明的公共类方法模块)。因此,在您的示例中,f
在模块MM
混合到类CC
时成为私有实例方法,但也可以用作: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
。