有没有“eval”和“Kernel.const_get”的替代品?

时间:2014-03-29 08:21:11

标签: ruby metaprogramming

我需要从名称中创建一个对象作为字符串(即某些JSON中的值)。我知道我可以使用:

classname = 'MyClass' 
eval classname

并且好多了:

classname = 'MyClass'
obj = Kernel.const_get(classname)

但由于这是Ruby,我想知道是否有其他替代方案(也许是更主观优雅的方式)来实现这一目标。

1 个答案:

答案 0 :(得分:2)

所以我已经在网上搜索了,简短的回答是"没有"。

然而Kernel#qualified_const_get written by a "Gregory"有点整洁,因为它可以获得嵌套类,但这显然不是本机Ruby。

我发现了一个很棒的博客"电动羊"作者:Sidu Ponnappa,他使用所有三种方法做了精彩的写作" Loading classes from strings in Ruby" - 结论是:

  

尝试将字符串转换为时,有三种选择   对应的类:内核#const_get,eval和   内核#qualified_const_get

     
      
  1. 内核#const_get是最快的,不处理嵌套类和   适用于除了最奇怪的场景之外的所有场景(您正在尝试的课程)   掌握isn的命名常数

  2.   
  3. eval明显变慢,但它适用于任何情况

  4.   
  5. 内核#qualified_const_get非常慢,但处理嵌套   类。但是,在有本机实现之前,它会失败   每个方面的评估

  6.