繁体   English   中英

send和instance_eval之间的Ruby差异?

[英]Ruby difference between send and instance_eval?

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

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

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

精细手册

发送(符号[,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__

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM