2010-08-26 10 views

Odpowiedz

17

Można użyć:

Object.const_get(class_name) 

$ irb 
>> class Person 
>>  def name 
>>   "Person instance" 
>>  end 
>> end 
=> nil 
>> class_name = "Person" 
=> "Person" 
>> Object.const_get(class_name).new.name 
=> "Person instance" 
+1

Thanks @OscarRyz i @Magnar to działa doskonale – Rohit

1

Spróbuj:

Kernel.const_get "Text" 

Dla własnych określonych modułów:

MyModule.const_get "Text" 
3

Spróbuj tego.

Object.const_get("String") 

To, w czym "Tekst" zostanie zamieniony, zależy od kodu. Jeśli wróci z modułem, to tekst jest modułem, ponieważ nie możesz mieć zarówno modułu, jak i klasy o tej samej nazwie. Może jest klasa Text w innym module, do którego masz zamiar się odwoływać? Trudno powiedzieć więcej, nie wiedząc więcej o kodzie.

2
classname = "Text" 
Object.const_set(classname, Class.new{def hello;"Hello"; end}) 

t = Object.const_get(classname).new 
puts t.hello # => Hello 

Sztuką jest wyjaśnione tutaj: http://blog.rubybestpractices.com/posts/gregory/anonymous_class_hacks.html gdzie autor używa go do podklasy StandardError.

+0

co jeśli klasa jest już zdefiniowana gdzieś indziej. Użytkownik wprowadza ciąg znaków i zgodnie z tym ciągiem należy utworzyć instancję odpowiedniej klasy. Sprawdź odpowiedź @Ocarcaryz, która daje mi idealne rozwiązanie. Dzięki. – Rohit

1

byłby to powrót nowy obiekt klasy classname:

eval(classname).new

Powiązane problemy