在Ruby中定义module_function

时间:2015-09-28 10:53:09

标签: ruby

注意:此问题已在Ruby-Forum发布,但没有得到答案

考虑这个模块:

module MM
  def f
  end
  def self.g
  end
  module_function :f
end

fg都是模块函数,可以称为

MM::f
MM::g

这只是一个品味问题,还是有充分理由选择 一种定义模块功能的方法是什么?

我知道,当我使用模块时,的区别 一个混音:

class CC
  include MM
end

在这种情况下,f也可用作CC中的实例方法 g不是。但是,这并不是我特别关注的 有趣的特点:如果我设计一个模块用作mixin 上课时,我不知道为什么我会使用module_function。还有其他吗? 我赞成self.FUNCTIONmodule_function的原因 在定义模块函数时?

1 个答案:

答案 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