当前位置:  开发笔记 > 编程语言 > 正文

什么时候Ruby中的'eval`是合理的?

如何解决《什么时候Ruby中的'eval`是合理的?》经验,为你挑选了5个好方法。

" 'eval'应该是令人讨厌的吗? "启发了这个:

大多数人都认为这eval很糟糕,并且在大多数情况下更优雅/更安全.

所以我想问:如果eval经常误用,是否真的需要作为语言功能?这是邪恶而不是好吗?

就个人而言,我发现它唯一有用的地方是插入配置文件中提供的字符串.

编辑:这个问题的目的是在eval是唯一或最佳解决方案时尽可能多地获得真实案例.所以,请不要进入"应该用语言限制程序员的创造力"的方向.

编辑2:当我说eval,当然我指的是eval字符串,而不是将红宝石块传递给instance_evalclass_eval.



1> Chuck..:

我所知道的唯一情况(除了"我有这个字符串,我想执行它")是动态处理本地和全局变量.Ruby有方法来获取局部变量和全局变量的名称,但是缺少基于这些名称来获取或设置其值的方法.做AFAIK的唯一方法就是eval.

任何其他用途几乎肯定是错误的.我不是大师,也不能明确说明没有其他人,但我曾经见过的其他一些用例,有人说"你需要eval,"我找到了一个没有的解决方案.

请注意,顺便说一下,我在这里谈论字符串eval.Ruby也有instance_eval,它可以在接收器的上下文中执行字符串或块.这种方法的块形式快速,安全且非常有用.


我知道这超出了主要问题的范围,但我很好奇你需要动态分配本地/全局变量的实际用例,即当使用实例属性和适当的方法时,instance_variable_set和instance_variable_get不起作用?

2> Mike Woodhou..:

什么时候有道理?我会说什么时候没有合理的选择.我能够想到一个我无法想到替代方案的用途:irb,如果你挖得足够深(workspace.rb如果你感兴趣的话,我的副本中的80行左右)使用eval来执行你的输入:

def evaluate(context, statements, file = __FILE__, line = __LINE__)
  eval(statements, @binding, file, line)
end

这对我来说似乎很合理 - 在你被要求这样做的那一刻,你特别不知道你要执行什么代码的情况.动态和互动的东西似乎符合要求.



3> tadman..:

eval的原因在于,当你需要它时,当你真正需要它时,没有替代品.毕竟,只有你可以用创造性的方法调度做这么多,并且在某些时候你需要执行任意代码.

仅仅因为语言具有可能危险的特征并不意味着它本身就是一件坏事.当一种语言假设比其用户更多时,那就是遇到麻烦的时候.

我认为,当你发现一种没有危险的编程语言时,你会找到一种不太有用的编程语言.

eval何时合理?用务实的话来说,当你说的时候.如果它是您的程序并且您是程序员,则可以设置参数.


我唯一可以补充的是"当你说它是和你知道后果时它是合理的".

4> horseyguy..:

有一个非常重要的用例,eval()不能使用其他任何东西来实现(AFAIK),那就是找到绑定的相应对象引用.

假设您已经传递了一个块但是(由于某种原因)您需要访问绑定的对象上下文,您将执行以下操作:

obj = eval('self', block.binding)

定义以下内容也很有用:

class Proc
    def __context__
        eval('self', self.binding)
    end
end



5> Diego Dias..:

IMO主要用于域特定语言.

" Ruby中的评估选项 "是Jay Fields关于InfoQ的一篇文章.

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有