send和instance_eval之间的Ruby差异?

Chu*_* Lu 7 ruby send instance-eval

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

我的问题是下面的例子中"引擎盖下 "的区别是什么?

1234.send 'to_s'               # '1234'
1234.instance_eval 'to_s'      # '1234'
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 7

精细手册:

send(symbol [,args ...])→obj
send(string [,args ...])→obj

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

并为instance_eval:

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

在接收器(obj)的上下文中计算包含Ruby源代码或给定块的字符串.为了设置上下文,在代码执行时将变量self设置为obj,使代码能够访问obj的实例变量.

因此send执行一个方法,然后instance_eval执行任意代码块(作为字符串或块),并self设置为您正在调用的对象instance_eval.

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

您可能也有兴趣在Object#public_sendBasicObject#__send__


saw*_*awa 7

无论你能做什么send都是适当的一部分instance_eval.也就是说,参数send必须是单个方法(及其参数),而参数instance_method是任意代码.所以每当你有send,你可以用它重写instance_eval,但反之亦然.

但是,性能send方面要快得多,instance_eval因为执行时不需要额外的解析send,而instance_eval需要解析整个参数.

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