Ruby 如何访问父/同级模块方法

Ruby 如何访问父/同级模块方法,ruby,Ruby,是否有任何方法可以访问baz_method内部类Qux而不首先提及模块名称空间?当有许多嵌套模块时,代码看起来并不干净 module Foo module Bar module Baz class Qux def self.qux_method Foo::Bar::Baz.baz_method end end def self.baz_method end end e

是否有任何方法可以访问
baz_method
内部
类Qux
而不首先提及模块名称空间?当有许多嵌套模块时,代码看起来并不干净

module Foo
  module Bar
    module Baz
      class Qux
        def self.qux_method
          Foo::Bar::Baz.baz_method  
        end
      end
      def self.baz_method
      end
    end 
  end
end

注意:除非您明确寻找相对模块访问,否则此元编程是不必要的。改用@drhing

您可以使用
模块#嵌套
动态地爬升模块层次结构:

module Foo
  module Bar
    module Baz
      class Qux
        def self.qux_method
          Module.nesting[1].baz_method  
        end
      end

      def self.baz_method
        puts "foo!"
      end
    end
  end
end
在这种情况下,
Module.nesting
将给出以下内容(在
qux\u方法中调用时):
[Foo::Bar::Baz::qux,Foo::Bar::Baz,Foo::Bar,Foo]


请注意,这并不是对
Baz
的明确引用,而是对模块链中上一级的内容的明确引用。

您不需要指定整个名称空间链。您只需要尽可能多地消除常数的歧义。只需使用
Baz.Baz_方法

module Foo
  module Bar
    module Baz
      class Qux
        def self.qux_method
          Baz.baz_method
        end
      end

      def self.baz_method
      end
    end
  end
end

常量首先在词汇封闭模块中查找,然后在继承链中查找

module Foo
  module Bar
    module Baz
      class Qux
        def self.qux_method
          Baz.baz_method    
        end
      end
      def self.baz_method
      end
    end
  end
end
这将起作用,因为常量
Baz
将首先在词汇封闭模块(类)
Qux
中查找,而在该模块中找不到它。在词汇封闭模块
Baz
中继续查找,在该模块中也找不到它。因此,接下来将在词汇封闭模块
Bar
中查找它,在那里找到它并停止搜索

注意:您在标题中写下:

Ruby,访问父/同级模块方法

这是错误的。这些模块既不是父模块,也不是兄弟模块。这里没有继承权。事实上,模块之间根本没有关系。常量和模块之间只有一种关系:常量属于模块


模块声明是按词汇嵌套的,但模块本身不是。

这就是namespace.Duh的全部目的。我真不敢相信我竟然忘了写我的答案+1.我不知道
Module.nesting
。这在这里是不必要的,但如果你在做一些有趣的事情,它似乎是有用的。
[Qux,Baz,Bar,Foo]
不清楚。你是说
[Foo::Bar::Baz::Qux,Foo::Bar::Baz,Foo::Bar,Foo]
?@sawa:我不是字面意思,但我想我没说清楚。使用完整名称空间将其更改为您的版本。“这不是对Baz的明确引用”:这怎么可能是不明确的?你能举个例子吗?