2012-04-01 4 views
0

Имея следующий модуль:Определить модуль внутри модуля

module Foo 
end 

Как мы можем добавить внутри этого Foo модуля еще один модуль от его имени (с, например: name = 'Bar')?

Я хотел бы динамически получить это:

module Foo 
    module Bar 
    end 
end 
+0

Что значит «динамически добавлять»? –

+0

Это вопрос интервью? –

+0

yup @ sergio-tulentsev, просто добавив модуль внутри модуля. – Doug

ответ

4

Без (уродливой) строки Eval:

module Foo 
end 

bar = Module.new 
Foo.const_set(:Bar, bar) 
+0

Почему уродливый? Это делает работу :) –

+0

Удивительный, спасибо! – Doug

+0

Да, но с строкой eval вы теряете много информации и должны переосмысливать все. Представьте, что 'name' является' 'Foo Bar''. Получайте удовольствие отладки. – Reactormonk

1

Это довольно просто:

module Foo 
end 

name = 'Bar' 

Foo.class_eval <<RUBY 
    module #{name} 
    end 
RUBY 

puts Foo::Bar 
# >> Foo::Bar 
+0

Спасибо. Но 'class_eval' является жестоким. Я бы предпочел сделать это с помощью простых методов метапрограммирования, а не строкой, кодирующей некоторый код Ruby. – Doug

+0

String eval так же просто, как может. :) –

-2

Вы просто напишите:

# In some part of your codebase: 
module Foo 
end 

# Extension: 
module Foo 
    module Bar 
    end 
end 
+2

Я предполагаю, что это не чтение самого важного слова «динамически», а это означает, что часть информации, такая как имя внутреннего модуля, указана в переменной. – Reactormonk

+0

Правильно, спасибо ТАСС! – TuteC

Смежные вопросы