2012-07-03 7 views
5

Bir Ruby nesnesini bir modülle genişletmek istiyorum ancak çalışma zamanında kullanmak için hangi modülün değiştirilebileceğini ve bunu nesne ile değiştirebilme yeteneğine sahip olmak istiyorum. Başka bir deyişle, modülün ismini bir parametre olarak extend'a aktarmak istiyorum. Bunu nasıl yapabilirim?Ruby'de bir nesneyi, bir parametrede adı verilen bir modülle nasıl genişletebilirim?

: -

Ama bu olsun

module M1 
end 

module M2 
end 

class C 
    def initialize module_to_use 
    extend module_to_use 
    end 
end 

m = get_module_name_from_config_file 
c1 = C.new m 

(. Burada "M1" veya "M2" ya istenen modülünün adını taşıyan bir String döndüren get_module_name_from_config_file yöntem olduğunu varsayarsak):

Aşağıdaki çalıştı
error: wrong argument type String (expected Module). 

, mString türünde değil,'dir, açıkçası. Ben de bir sembolü olan m ile denedim, ancak aynı sorunu alıyorum (String hata iletisinde Symbol ile değiştirin).

m'u Module türünde bir şeye dönüştürebilir miyim? Ya da bunu başarabileceğim başka bir yol var mı?

Şimdiden teşekkürler.

+0

Böyle bir şey const_get ile çalışır mı? http://stackoverflow.com/questions/2361347/how-to-convert-a-string-to-a-constant-in-ruby – jstim

cevap

5

Sen gibi yapabilirsin bu (Jörg W Mittag önerisi başına const_get kullanmak üzere modifiye)

module M1 
end 

module M2 
end 

class C 
    def initialize module_to_use 
    extend module_to_use 
    end 
end 

m = Module::const_get("M1") 
c1 = C.new m 

Sen btw yukarıdaki kodunuzda bazı hatalar vardı - class ve module küçük harf kullanılmalıdır.

+2

Lütfen yapmayın. Burada 'eval' kullanmaya kesinlikle gerek yok. Sadece 'const_get' kullanın. –

+0

@ JörgWMittag: Üzgünüm. sabit. – Peter

+0

Teşekkürler, bu mükemmel çalışıyor. Büyük harfleri orijinal soruda da düzeltdim. –

İlgili konular