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]