3 回答
TA贡献2003条经验 获得超2个赞
在Ruby中,有几个噱头可能比eval()
以下更合适:
有
#send
一个允许您调用一个名称为字符串并将参数传递给它的方法。yield
允许您将代码块传递给将在接收方法的上下文中执行的方法。通常,简单
Kernel.const_get("String")
就足以获得您的名称为字符串的类。
我想我无法详细解释它们,所以我只是给了你提示,如果你有兴趣,你会谷歌。
TA贡献1802条经验 获得超5个赞
eval不仅不安全(正如其他地方所指出的那样),它也很慢。每次执行时,evaled代码的AST都需要重新解析(对于例如JRuby,转向字节码),这是一个字符串繁重的操作,也可能对缓存局部性有害(假设正在运行)程序不是eval很多,因此解释器的相应部分因此缓存冷,除了很大)。
eval你问,为什么在Ruby中根本没有?“因为我们可以”大多数 - 事实上,当eval发明时(对于LISP编程语言),它主要用于表演!更重要的eval是,当您想要“将解释器添加到解释器中”时,使用正确的东西,用于元编程任务,例如编写预处理器,调试器或模板引擎。这类应用程序的常见想法是按摩一些Ruby代码并调用eval它,它肯定会重新发明并实现特定于域的玩具语言,这也是一个陷阱,也被称为Greenspun的第十条规则。需要注意的是:注意成本,例如对于模板引擎,eval在启动时进行所有操作而不是运行时间; 并且不eval不可信代码,除非你知道如何“驯服”它,即根据能力规则理论选择并强制执行语言的安全子集。后者是很多非常困难的工作(例如,看看Java是如何完成的 ;我不知道Ruby的任何这样的努力)。
- 3 回答
- 0 关注
- 524 浏览
添加回答
举报