" 'eval'应该是令人讨厌的吗? "启发了这个:
大多数人都认为这eval
很糟糕,并且在大多数情况下更优雅/更安全.
所以我想问:如果eval
经常误用,是否真的需要作为语言功能?这是邪恶而不是好吗?
就个人而言,我发现它唯一有用的地方是插入配置文件中提供的字符串.
编辑:这个问题的目的是在eval是唯一或最佳解决方案时尽可能多地获得真实案例.所以,请不要进入"应该用语言限制程序员的创造力"的方向.
编辑2:当我说eval
,当然我指的是eval
字符串,而不是将红宝石块传递给instance_eval
或class_eval
.
我所知道的唯一情况(除了"我有这个字符串,我想执行它")是动态处理本地和全局变量.Ruby有方法来获取局部变量和全局变量的名称,但是缺少基于这些名称来获取或设置其值的方法.做AFAIK的唯一方法就是eval
.
任何其他用途几乎肯定是错误的.我不是大师,也不能明确说明没有其他人,但我曾经见过的其他一些用例,有人说"你需要eval,"我找到了一个没有的解决方案.
请注意,顺便说一下,我在这里谈论字符串eval.Ruby也有instance_eval
,它可以在接收器的上下文中执行字符串或块.这种方法的块形式快速,安全且非常有用.
什么时候有道理?我会说什么时候没有合理的选择.我能够想到一个我无法想到替代方案的用途:irb,如果你挖得足够深(workspace.rb
如果你感兴趣的话,我的副本中的80行左右)使用eval来执行你的输入:
def evaluate(context, statements, file = __FILE__, line = __LINE__) eval(statements, @binding, file, line) end
这对我来说似乎很合理 - 在你被要求这样做的那一刻,你特别不知道你要执行什么代码的情况.动态和互动的东西似乎符合要求.
eval的原因在于,当你需要它时,当你真正需要它时,没有替代品.毕竟,只有你可以用创造性的方法调度做这么多,并且在某些时候你需要执行任意代码.
仅仅因为语言具有可能危险的特征并不意味着它本身就是一件坏事.当一种语言假设比其用户更多时,那就是遇到麻烦的时候.
我认为,当你发现一种没有危险的编程语言时,你会找到一种不太有用的编程语言.
eval何时合理?用务实的话来说,当你说的时候.如果它是您的程序并且您是程序员,则可以设置参数.
有一个非常重要的用例,eval()
不能使用其他任何东西来实现(AFAIK),那就是找到绑定的相应对象引用.
假设您已经传递了一个块但是(由于某种原因)您需要访问绑定的对象上下文,您将执行以下操作:
obj = eval('self', block.binding)
定义以下内容也很有用:
class Proc def __context__ eval('self', self.binding) end end
IMO主要用于域特定语言.
" Ruby中的评估选项 "是Jay Fields关于InfoQ的一篇文章.