在ruby中定义模块内的方法(NoMethodError)

Ama*_*nut 14 ruby methods module ruby-on-rails

我正在学习红宝石,我想出了一些我不理解的东西.我知道ruby中的模块用于命名空间: :(或.)并与include指令混合.当我将一些方法组合在一个模块中而不将它们放在一个类中时,就会出现问题.这是一个例子:

module Familiar
  #this will not work
    def ask_age
      return "How old are you?"
    end
  #this will work
    def Familiar::greeting
      return "What's up?"
    end
end
# this call returns **NoMethodError** 
puts(Familiar::ask_age()) 
# this call works fine
puts(Familiar::greeting()) 
Run Code Online (Sandbox Code Playgroud)

为什么我需要包含命名空间来定义方法,我已经在命名空间内熟悉为什么我必须重复我的自我并把Familiar :: greeting 你可以在这个链接后在线测试我的例子:http:// codepad .ORG/VUgCVPXN

Chr*_*ald 29

关于模块Ruby文档在其介绍文本中回答了这个问题.

这种形式:

module Familiar
  def ask_age
    return "How old are you?"
  end
end
Run Code Online (Sandbox Code Playgroud)

在Familiar上定义#ask_age实例方法.但是,您无法实例化模块,因此无法直接访问其实例方法; 你把它们混合到其他类中.模块中的实例方法或多或少直接无法访问.

相比之下,这种形式:

module Familiar
  def self.ask_age
    return "What's up?"
  end
end
Run Code Online (Sandbox Code Playgroud)

定义::ask_age模块功能.它可以直接调用,并且当模块混合到另一个类中时不会出现在包含的类中.

  • @RichPeck没有,模块无法实例化.但是这个模块可以包含在类中,那些实例可以使用`ask_age`方法. (2认同)