2012-01-05 81 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" 
相关问题