2015-12-28 3 views
1

До сих пор я знаю, чтобы получить модуль ребенка, один должен выполняет такую ​​операцию:Ruby: получить модуль родственного

module ParentModule 
    module Foo 
    # to be implemented 
    def self.get_bar 
     ::ParentModule::Bar 
    end 
    end 

    module Bar 
    # to be implemented 
    end 
end 

Однако есть способ, чтобы получить модуль родственного без ссылки на родительский один? Что-то вроде этого:

module Foo 
    def self.get_bar 
    ::Bar # doesn't work actually 
    end 
end 
+3

Вы пробовали просто исключить часть ':: ParentModule'? Что вы видите и что вы пробовали? – yez

+1

Можете ли вы уточнить свой вопрос? Термины «родительский» и «дочерний» подразумевают наследование, но здесь нет наследования. –

+0

Конечно, я пробовал. Если я имею в виду модуль Bar из модуля Foo <- Язык: рубин -> Защиту self.get_bar :: Бар конец я * NameError: неинициализированным постоянная * – DreamWalker

ответ

2

Это проще, чем вы думали,

module ParentModule 
    module Foo 
    def self.get_bar 
     Bar 
    end 
    end 
end 

:: вы пытались с, он инструктирует рубин в Посмотрите это имя в области верхнего уровня. Если вы опустите это, рубин сначала будет выглядеть в текущей области, потом его родителя, потом его родителя и вплоть до верхнего уровня.

Итак, ParentModule::Foo::Bar не будет найден, но ParentModule::Bar будет.

1
mod = ParentModule::Bar 
    #=> "ParentModule::" 
parent_str = mod.to_s[/.+::/] 
    #=> "ParentModule::" 
kids = ObjectSpace.each_object(Module).select { |m| m.to_s =~ /^#{parent_str}/ } 
    #=> [ParentModule::Bar, ParentModule::Foo] 

Так mod «s братья и сестры:

kids - [mod] 
    #=> [ParentModule::Foo] 
+0

Я думаю, что вы «переопределили» это :) –

+0

@ Серхио, я не уверен, что он слишком переработан для ответа на вопрос, который, к сожалению, не тот, который был задан. Я пытался идентифицировать модули (неизвестные) модуля «sibling». –

+0

Да, вы ответили на неправильный вопрос, кажется. Но он должен работать на этот вопрос. Могу ли я предложить то, что я считаю более простым решением? http://pastie.org/10658469 –