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

时间:2013-12-21 20:57:30

标签: ruby class module hierarchy ancestor

我已经定义了一个方法,里面有很少的类和很少的模块。从其中一个类我试图调用一个模块中定义的方法(在公共内部),我得到一个访问错误。这是完整的层次结构:

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

 module NestedModule
   def method_name
     #some code
   end
 end
end

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

2 个答案:

答案 0 :(得分:0)

将其写为:

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

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

答案 1 :(得分:0)

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

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”在这里也可以使用,但惯例是在调用类/模块方法时使用点,在访问嵌套模块/类时使用双冒号。