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的明确引用”:这怎么可能是不明确的?你能举个例子吗?