Ruby 如何从对象动态获取嵌套模块?
鉴于: 我们希望能够将模块嵌套为一个数组。如果事先知道该类,则可以执行此操作。例如:Ruby 如何从对象动态获取嵌套模块?,ruby,metaprogramming,Ruby,Metaprogramming,鉴于: 我们希望能够将模块嵌套为一个数组。如果事先知道该类,则可以执行此操作。例如: module A class B end end b = A::B.new 但是,如何对任意对象执行此操作,以便我们可以执行以下操作: module A class B def get_nesting Module.nesting # => [A::B, A] end end end 如果我们尝试上面的方法,就会得到一个空数组。您正在寻找类似的东西吗 m
module A
class B
end
end
b = A::B.new
但是,如何对任意对象执行此操作,以便我们可以执行以下操作:
module A
class B
def get_nesting
Module.nesting # => [A::B, A]
end
end
end
如果我们尝试上面的方法,就会得到一个空数组。您正在寻找类似的东西吗
module Nester
def get_nesting
Module.nesting
end
end
b.get_nesting
模块D
A=10
E类
模块F
结束
结束
结束
定义所有_嵌套(顶部)
结果=[]
工作空间=[顶部]
虽然是空的吗?
item=workspace.shift
结果[D,D::E,D::E::F]
我刚刚构建了Class.hierarchy
,它从Object
开始,并将每个类步骤一直返回到所讨论的类
module D
A = 10
class E
module F
end
end
end
def all_nestings(top)
result = []
workspace = [top]
while !workspace.empty?
item = workspace.shift
result << item
item.constants.each do |const|
const = item.const_get(const)
next unless const.class == Class || const.class == Module
workspace.push const
end
end
result
end
puts all_nestings(D).inspect # => [D, D::E, D::E::F]
它返回以下内容:
module A
module B
module C
class D
def self.hello
"hello world!"
end
end
end
end
end
注意,这些是模块和类本身,而不仅仅是字符串。比如说,
A::B::C::D.hierarchy # => [Object, A, A::B, A::B::C, A::B::C::D]
一个真实世界类的示例:
A::B::C::D.hierarchy.last.hello # => "hello world!"
美好的几乎有效。。。对于您不知道模块等的对象,它将如何工作?是否可以这样说:e=D::e.newall_嵌套(e.class).inspect?
A::B::C::D.hierarchy.last.hello # => "hello world!"
require 'net/smtp'
Net::SMTP.hierarchy # => [Object, Net, Net::SMTP]