【问题标题】:How to get a class from a String?如何从字符串中获取类?
【发布时间】:2012-02-03 13:01:02
【问题描述】:

我想用一个类(不是符号!)来索引一个哈希,如下所示

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

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

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

【问题讨论】:

标签: ruby string class constants


【解决方案1】:

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

我应该补充一下,这是一把锋利的刀,不要用这种技术割伤自己。您要确保您正在评估的字符串不能包含任何恶意代码。

【讨论】:

  • 我认为我们不应该建议人们使用eval,除非有必要。在这种情况下,它绝对没有必要。
  • 公平批评,这个问题还有其他更好的方法。
【解决方案2】:

你可以使用Kernel#const_get:

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

【讨论】:

    【解决方案3】:

    如果您使用的是 Rails,那么您会发现 ActiveSupport 的“常量化”可以做您想做的事情。

    "String".constantize
    => String
    

    但你可以做类似的事情。

    Object.const_get("String")
    => String
    

    你甚至可以在字符串上定义它

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多