首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Ruby中定义module_function

在Ruby中定义module_function
EN

Stack Overflow用户
提问于 2015-09-28 10:53:08
回答 1查看 664关注 0票数 4

注意:这个问题已经在https://www.ruby-forum.com/topic/6876455上发布了,没有得到答案。

考虑一下这个模块:

代码语言:javascript
复制
module MM
  def f
  end
  def self.g
  end
  module_function :f
end

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

代码语言:javascript
复制
MM::f
MM::g

这仅仅是品味问题,还是有充分的理由选择一种定义模块功能的方式而另一种方式呢?

我意识到,当我将模块用作混合器时,两者之间存在差异:

代码语言:javascript
复制
class CC
  include MM
end

在这种情况下,f也可以作为CC中的实例方法使用,而g则不能。然而,在我看来,这并不是一个非常有趣的特性:如果我设计一个模块作为类的混合器,我就不明白为什么要使用module_function。在定义模块函数时,我会喜欢self.FUNCTIONmodule_function,还有其他原因吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-28 11:20:32

来自文档

module_function为命名方法创建模块函数。这些函数可以以模块作为接收方调用,也可以作为实例方法用于混合在模块中的类。模块函数是原始函数的副本,因此可以独立修改。实例方法版本是私有的。如果在没有参数的情况下使用,则随后定义的方法将成为模块函数。

基本上,module_function是使用模块方法的一种方式,无需将模块混入到类中。

区别在于,如果混合使用module_function的模块,混合方法将成为私有实例方法(但它们将是声明模块的公共类方法)。因此,在您的示例中,当模块f被混合到类CC时,MM变成了私有实例方法,但也可以用作:MM.f

当你有:

代码语言:javascript
复制
module MM
  def f
  end
  module_function :f
end

然后,您可以使用MM.f,而无需将MM模块混合到CC类中。但是,如果你不使用

代码语言:javascript
复制
module_function :f

始终可以使用以下方法将模块MM混入到CC类中:

代码语言:javascript
复制
class CC
  include MM
end

并可以使用方法f作为CC类对象的实例方法。

总的来说,您没有更好的理由使用module_function。如果您希望将模块方法作为类的实例方法,那么只需将模块包含到类中(混合模块到类中),如上面的示例所示。

此外,在定义static/utility方法时,您应该这样做:

代码语言:javascript
复制
module MM
  def self.g
  end
end

或者你甚至可以这样做:

代码语言:javascript
复制
module MM
  extend self

  def g
  end
end

然后使用这样的方法:没有混合模块的MM.g。因此,您实际上不需要使用module_function

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32821237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档