2012-01-05 48 views
0

我想用指標一類的散列(不是象徵!),像下面如何從一個字符串中獲得一個類?

irb(main):015:0> class Key ;end 
=> nil 
irb(main):016:0> h={Key => "ok"} 
=> {Key=>"ok"} 

好。 然後,給定類的名稱,作爲一個字符串,我希望得到的元素:

irb(main):017:0> str="Key" 
=> "Key" 
irb(main):018:0> h[str] 
=> nil 

但是(如上圖所示)失敗(當然)。

所以我的問題:我如何將字符串轉換爲實際類?

+0

的([字符串和類名之間的鑄造]可能重複http://stackoverflow.com/questions/1448293/cast-between-string-and-classname) – 2012-01-05 22:07:31

回答

3

您可以使用Kernel#const_get

str = "Key" 
k = Kernel.const_get(str) 
val = h[k] 
-3

您可以使用h[eval(str)]。有關eval in the Ruby 1.9.3 docs的更多信息

我應該補充說這是一把鋒利的刀,不要用這種技術削減自己。您希望確保您所評估的字符串不能包含任何惡意代碼。

+0

我認爲我們不應該建議人們使用'eval',除非它是必要的。在這種情況下,它絕對沒有必要。 – 2012-01-05 17:57:02

+0

公平的批評,還有其他更好的方法來解決這個問題。 – 2012-01-05 17:59:14

6

如果您使用Rails的,那麼你會發現的ActiveSupport的「constantize」做你想做的。

"String".constantize 
=> String 

但是你可以做類似的事情。

Object.const_get("String") 
=> String 

,你甚至可以在串定義此

class String 
    def constantize 
    Object.const_get(self) 
    end 
end 

注:儘量避免做「EVAL」除非你真的需要它。

0

你可以做這樣的(你可能不希望使用eval):

>> class Key ;end #=> nil 
>> h={Key => "ok"} #=> {Key=>"ok"} 
>> str="Key" #=> "Key" 
>> h[Kernel.const_get(str)] #=> "ok" 
相關問題