send和instance_eval之间的Ruby差异?

时间:2013-08-04 20:25:24

标签: ruby send instance-eval

我知道发送带有参数的字符串或符号,而instance_eval接受字符串或块,并且给定接收器它们的区别可能很明显。

我的问题是下面的示例中“引擎盖”的区别是什么?

1234.send 'to_s'               # '1234'
1234.instance_eval 'to_s'      # '1234'

2 个答案:

答案 0 :(得分:7)

来自fine manual

  

发送(符号[,args ...])→obj
  发送(字符串[,args ...])→obj

     

调用 symbol 标识的方法,并将指定的任何参数传递给它。 [...]当方法由字符串标识时,字符串将转换为符号。

instance_eval

  

instance_eval(string [,filename [,lineno]])→obj
   instance_eval {| |阻止}→obj

     

在接收器( obj )的上下文中计算包含Ruby源代码或给定块的字符串。为了设置上下文中,变量self设置为 OBJ 在代码执行时,使该代码访问的 OBJ 实例变量。< / p>

因此send执行方法,而instance_eval执行任意代码块(作为字符串或块),self设置为您正在调用的对象{{1} } on。

在你的情况下,没有太大的区别,因为你传递给instance_eval的字符串只是一种方法。主要区别在于,任何阅读您的代码的人(包括您在六个月内)都会想知道您使用instance_eval调用单一方法的原因。

您可能也对Object#public_sendBasicObject#__send__

感兴趣

答案 1 :(得分:7)

无论您使用send做什么都是instance_eval的适当子集。也就是说,send的参数必须是单个方法(及其参数),而instance_method的参数是任意代码。因此,只要您拥有send,就可以使用instance_eval重写它,但反之亦然。

但是,性能方面,sendinstance_eval快得多,因为执行send不需要额外的解析,而instance_eval需要解析整个参数。< / p>

在您的示例中,结果将是相同的,但第一个将运行得更快。