代码之家  ›  专栏  ›  技术社区  ›  Aaron Christiansen

获取Ruby中任何给定模块的嵌套继承权

  •  0
  • Aaron Christiansen  · 技术社区  · 7 年前

    我有一个方法,需要能够访问模块定义的嵌套层次结构。假设我有这样的定义:

    module A
      module B
        module C
        end
      end
    end
    

    C 传递给方法时,它能够返回 Module.nesting 好像它是在定义中被调用的。例如:

    get_nesting(A::B::C) # => [A::B::C, A::B, A]
    

    单元筑巢 在不同的背景下。我试过使用 instance_exec ,但这只是返回当前范围中的嵌套。

    module X
      def self.get_nesting(m)
        m.instance_exec { Module.nesting }
      end
    end
    
    X.get_nesting(A::B::C) # => [X]
    

    [A::B::C, A::B, A] 相反

    有没有一种方法可以通过使用 还是别的?

    0 回复  |  直到 7 年前
        1
  •  1
  •   Cary Swoveland    7 年前

    试试这个:

    module A
      module B
        module C
          Module.nesting
        end
      end
    end
      #=> [A::B::C, A::B, A]
    
    module A::B
      module C
        Module.nesting
      end
    end
      #=> [A::B::C, A::B] 
    

    原因 A nesting 取决于代码的结构(“词法”),而不是模块的父子关系。因此,我认为任何导致 self Module.nesting ,注定要失败。

    但是,您可以执行以下操作。

    def get_nesting(mod)
      a = mod.to_s.split('::')
      a.size.times.map { |i| Module.const_get(a[0..i].join('::')) }.reverse
    end
    

    get_nesting(A)       #=> [A] 
    get_nesting(A::B)    #=> [A::B, A] 
    get_nesting(A::B::C) #=> [A::B::C, A::B, A] 
    
    get_nesting(A::B::C).map { |m| m.class } 
      #=> [Module, Module, Module]
    

    Module#to_s ,这将被归类为胡乱花钱。

    推荐文章