2010-08-26 5 views

risposta

17

Si potrebbe utilizzare:

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

Grazie @OscarRyz e @Magnar questo è perfettamente funzionante – Rohit

1

Prova:

Kernel.const_get "Text" 

Per i propri moduli definiti:

MyModule.const_get "Text" 
3

Prova questo.

Object.const_get("String") 

In che modo il "testo" viene convertito dipende dal codice in uso. Se ritorna con un modulo, allora Testo è un modulo, perché non puoi avere sia un modulo che una classe con lo stesso nome. Forse c'è una classe di testo in un altro modulo a cui vuoi riferirti? È difficile dire di più senza saperne di più sul tuo codice.

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

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

Il trucco è qui spiegato: http://blog.rubybestpractices.com/posts/gregory/anonymous_class_hacks.html in cui l'autore usa per creare una sottoclasse StandardError.

+0

cosa se la classe è già definita da qualche altra parte. L'utente immette una stringa e in base a tale stringa è necessario creare un'istanza della classe appropriata. Controlla la risposta di @OscarRyz mi dà la soluzione perfetta. Grazie. – Rohit

1

Ciò restituire un nuovo oggetto della classe classname:

eval(classname).new

Problemi correlati