Ruby祖先链中的方法访问有啥问题

Posted

技术标签:

【中文标题】Ruby祖先链中的方法访问有啥问题【英文标题】:What is the issue with the method acces in ancestors chain in RubyRuby祖先链中的方法访问有什么问题 【发布时间】:2013-12-21 20:57:29 【问题描述】:

我已经定义了一个方法,其中包含很少的类和很少的模块。从其中一个类中,我尝试调用在模块中定义的方法(在公共模块中),但出现访问错误。这是完整的层次结构:

module Top
 class NestedClass
   #some code
   NestedModule::method_name
 end

 module NestedModule
   def method_name
     #some code
   end
 end
end

我得到的错误是:Top::NestedModule:Module 的未定义方法 'method_name'

【问题讨论】:

【参考方案1】:

写成:

module Top
  module NestedModule
    def self.method_name
      #some code
    end
  end
  class NestedClass
    #some code
    NestedModule::method_name
  end
end

在您的情况下,您在定义模块 NestedModule 之前做了 NestedModule::method_name

【讨论】:

如果我在 Top 模块之外定义它并将它包含在我真正需要它的类(NestedClass)中怎么办? @user2128702 我没听懂你 我尝试了你的方法,但我得到了完全相同的 NoMethodError。我真的不知道为什么。 看来里面的所有方法都得是'self'。【参考方案2】:

您不能直接调用未声明的方法以及实例模块方法。 也许这会为你解决问题:

module Top
  module NestedModule
    def self.module_method
      1
    end

    def instance_method
      2
    end
  end

  class NestedClass
    NestedModule.module_method # => 1
    NestedModule.instance_method(:instance_method) # => #<UnboundMethod: Top::NestedModule#instance_method>

    extend NestedModule
    instance_method # => 2

    include NestedModule
    new.instance_method # => 2
  end
end

虽然“NestedModule::module_method”在这里也可以使用,但惯例是在调用类/模块方法时使用点,在访问嵌套模块/类时使用双冒号。

【讨论】:

以上是关于Ruby祖先链中的方法访问有啥问题的主要内容,如果未能解决你的问题,请参考以下文章

Ruby - 在类中获取非祖先方法的数组

Ruby 中的方法和消息有啥区别? [关闭]

Ruby中的每个方法和收集方法有啥不同[重复]

Ruby中的类和该类的单例有啥区别?

为啥我不能从 gcc 中的前身模板化成员函数访问祖先方法?

你的 JavaScript 工具链中有啥? [关闭]