如何从String中获取类?

时间:2012-01-05 17:36:55

标签: ruby string class constants

我想用一个Class(而不是一个符号!)来索引哈希,如下面的

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

好。 然后,给定Class的名称,作为字符串,我想得到元素:

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

但是(如上所示)这失败了(当然)。

所以我的问题是:如何将String转换为实际的类?

4 个答案:

答案 0 :(得分:6)

如果你正在使用Rails,那么你会发现ActiveSupport的“constantize”可以做你想要的。

"String".constantize
=> String

但你可以做类似的事情。

Object.const_get("String")
=> String

您甚至可以在字符串

上定义它
class String
  def constantize
    Object.const_get(self)
  end
end

注意:除非你真的需要,否则尽量避免做“eval”。

答案 1 :(得分:3)

您可以使用Kernel#const_get

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

答案 2 :(得分:0)

你可以这样做(你可能不想使用eval):

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

答案 3 :(得分:-3)

您可以使用h[eval(str)]。有关eval in the Ruby 1.9.3 docs

的更多信息 我应该加上这是一把锋利的刀,不要用这种技术削减自己。您希望确保您正在评估的字符串不能包含任何恶意代码。