为了账号安全,请及时绑定邮箱和手机立即绑定

'eval'应该是讨厌的吗?

'eval'应该是讨厌的吗?

Qyouu 2019-09-03 17:12:07
我多次使用eval红宝石的功能。但我听说有人说evals很讨厌。当被问到为什么以及如何,我永远无法得到令人信服的理由不使用它。他们真的很讨厌吗?如果是,以什么方式?评估有哪些“更安全”的选择?
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

在Ruby中,有几个噱头可能比eval()以下更合适:

  1. #send一个允许您调用一个名称为字符串并将参数传递给它的方法。

  2. yield 允许您将代码块传递给将在接收方法的上下文中执行的方法。

  3. 通常,简单Kernel.const_get("String")就足以获得您的名称为字符串的类。

我想我无法详细解释它们,所以我只是给了你提示,如果你有兴趣,你会谷歌。


查看完整回答
反对 回复 2019-09-03
?
12345678_0001

TA贡献1802条经验 获得超5个赞

eval不仅不安全(正如其他地方所指出的那样),它也很慢。每次执行时,evaled代码的AST都需要重新解析(对于例如JRuby,转向字节码),这是一个字符串繁重的操作,也可能对缓存局部性有害(假设正在运行)程序不是eval很多,因此解释器的相应部分因此缓存冷,除了很大)。


eval你问,为什么在Ruby中根本没有?“因为我们可以”大多数 - 事实上,当eval发明时(对于LISP编程语言),它主要用于表演!更重要的eval是,当您想要“将解释器添加到解释器中”时,使用正确的东西,用于元编程任务,例如编写预处理器,调试器或模板引擎。这类应用程序的常见想法是按摩一些Ruby代码并调用eval它,它肯定会重新发明并实现特定于域的玩具语言,这也是一个陷阱,也被称为Greenspun的第十条规则。需要注意的是:注意成本,例如对于模板引擎,eval在启动时进行所有操作而不是运行时间; 并且不eval不可信代码,除非你知道如何“驯服”它,即根据能力规则理论选择并强制执行语言的安全子集。后者是很多非常困难的工作(例如,看看Java是如何完成的 ;我不知道Ruby的任何这样的努力)。


查看完整回答
反对 回复 2019-09-03
  • 3 回答
  • 0 关注
  • 494 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信