【问题标题】:NoMethodError when trying to access a "nested method" (or def) in the same module尝试访问同一模块中的“嵌套方法”(或 def)时出现 NoMethodError
【发布时间】:2016-11-28 06:13:59
【问题描述】:

下面的代码给了我NoMethodError。我有点困惑为什么它会给我一个错误,以及为什么我在模块中找不到任何关于嵌套方法的信息。有人可以解释为什么这不起作用吗?我可以在模块中嵌套“defs”吗?

module HowToBasic
  module_function

  def say_id_and_say_name(id)

    # nested method
    def say_id(id)
      p id
    end

    # errors here with `say_id_and_say_name': 
    # undefined method `say_id' for HowToBasic:Module (NoMethodError)
    # from teststuff.rb:24:in `<main>'
    say_id(id)
  end

end

HowToBasic.say_id_and_say_name("99999")

版本: 红宝石 2.3.1p112

我看了看,找不到任何关于此的信息:

【问题讨论】:

    标签: ruby


    【解决方案1】:

    您在方法定义中缺少 self 关键字 - 没有它 say_id_and_say_name 只是一个实例方法,因此无法在 Module 上调用它。

    module HowToBasic
      module_function
    
      def self.say_id(id)
        p id
      end
    
      def self.say_id_and_say_name(id)    
        say_id(id)
      end    
    end
    
    HowToBasic.say_id_and_say_name("99999")
    

    【讨论】:

    • 谢谢。因此,如果我将say_id(id) 更改为self.say_id(id),那么这段代码就可以工作。有没有可以指点阅读“实例方法”的地方?
    • 当然,有很多地方,例如:culttt.com/2015/06/10/… 顺便说一句 - 你应该避免在另一个方法中声明方法(我指的是say_id)。我将在一分钟内编辑我的答案,以便您可以看到正确的定义。
    • Jordon,当 Ruby 解析你的模块时,self 等于 HowToBasic。因此,def self.say_id(id)def HowToBasic.say_id(id) 相同。 self 通常用于类方法定义,而不是对象的实际名称(实际上是模块对象)。使用self 的一个原因是,如果您更改模块的名称,您不必更改模块方法的定义。 (这也适用于类,因为类是模块。)您还可以在模块的单例类中定义模块方法,但这是另一天的教训。
    猜你喜欢
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    相关资源
    最近更新 更多