2012-04-01 86 views
0

具有以下模塊內部模塊:定義模塊

module Foo 
end 

我們怎樣才能添加此Foo模塊內的另一個模塊從它的名字(有例如:name = 'Bar')?

我想動態獲取這樣的:

module Foo 
    module Bar 
    end 
end 
+0

你是什麼意思,「動態添加」? – 2012-04-01 12:21:36

+0

面試問題嗎? – 2012-04-01 12:22:10

+0

yup @ sergio-tulentsev,只需在模塊中添加一個模塊即可。 – Doug 2012-04-01 12:25:59

回答

4

沒有(醜陋的)字符串的eval:

module Foo 
end 

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

爲什麼醜陋?它的工作:) – 2012-04-01 12:30:25

+0

真棒,謝謝! – Doug 2012-04-01 12:32:00

+0

是的,但是對於字符串評估,您會釋放大量信息並必須重新解釋所有內容。想象一下'name'是'「Foo Bar」'。調試一下吧。 – Reactormonk 2012-04-01 12:33:53

1

這是非常簡單的:

module Foo 
end 

name = 'Bar' 

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

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

謝謝。但'class_eval'是殘酷的。我寧願用簡單的元編程方法來完成它,而不是用一些字符串來表達一些Ruby代碼。 – Doug 2012-04-01 12:30:23

+0

字符串評估儘可能簡單。 :) – 2012-04-01 12:32:23

-2

你只寫它:

# In some part of your codebase: 
module Foo 
end 

# Extension: 
module Foo 
    module Bar 
    end 
end 
+2

我想這是關於不讀最重要的詞,'動態',這意味着部分信息,如內部模塊的名稱,是在一個變量中給出的。 – Reactormonk 2012-04-01 22:39:45

+0

沒錯,謝謝塔斯! – TuteC 2012-04-02 15:53:53