2010-08-26 50 views

回答

17

你可以使用:

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

感謝@OscarRyz和@Magnar如果什麼類已經被定義在其他地方,這是可以正常使用 – Rohit 2010-08-27 05:09:10

1

嘗試:

Kernel.const_get "Text" 

爲了你自己定義的模塊:

MyModule.const_get "Text" 
3

試試這個。

Object.const_get("String") 

什麼「文本」將變成取決於你的代碼真的。如果它帶有一個模塊,那麼Text就是一個模塊,因爲你不能同時擁有一個模塊和一個具有相同名稱的類。也許在另一個模塊中有一個Text類可以參考?不知道更多關於您的代碼的內容很難多說。

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

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

竅門在這裏解釋:http://blog.rubybestpractices.com/posts/gregory/anonymous_class_hacks.html 在這裏筆者用它來StandardError的子類。

+0

。用戶輸入一個字符串,並根據該字符串,你必須實例化適當的類。檢查@OscarRyz的答案它給了我完美的解決方案。謝謝。 – Rohit 2010-08-27 05:13:20

1

這將返回className類的一個新對象:

eval(classname).new