2012-07-03 12 views
5

Chciałbym rozszerzyć obiekt Ruby o moduł, ale chcę móc zmienić moduł, który ma być używany w czasie wykonywania, i mieć możliwość zmiany tego obiektu. Innymi słowy, chciałbym przekazać nazwę modułu do extend jako parametr. Jak mogę to zrobić?Jak mogę rozszerzyć obiekt w Ruby o moduł, którego nazwa jest podana w parametrze?

Próbowałem następujące:

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 

(Zakładając, że metoda get_module_name_from_config_file zwraca String z nazwą żądanego modułu - tutaj albo "M1" lub "M2".)

Ale mam to:

error: wrong argument type String (expected Module). 

ponieważ m jest typu String, a nie Module, oczywiście. Próbowałem go z m również jest symbolem, ale mam ten sam problem (zastąp String z Symbol w komunikacie o błędzie).

Czy mogę przekonwertować m na coś typu Module? Czy jest inny sposób, w jaki mogę to osiągnąć?

Z góry dziękuję.

+0

Czy coś takiego działa z const_get? http://stackoverflow.com/questions/2361347/how-to-convert-a-string-to-a-stant-in-ruby – jstim

Odpowiedz

5

Można zrobić to w ten sposób (zmodyfikowane do wykorzystania const_get za sugestią Jörg W Mittag za)

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 

Miałeś jakieś błędy w kodzie powyżej, btw - class i module powinny być pisane małymi literami.

+2

Proszę nie. Nie ma absolutnie potrzeby używania 'eval' tutaj. Po prostu użyj 'const_get'. –

+0

@ JörgWMittag: sorry. naprawiony. – Peter

+0

Dzięki chłopaki, to działa idealnie. Poprawiłem także wielkość liter w pierwotnym pytaniu. –

Powiązane problemy