[英]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(string [,filename [,lineno]])→obj
instance_eval {| | block}→obj在接收器( obj )的上下文中计算包含Ruby源代码或给定块的字符串。 为了设置上下文,在代码执行时将变量
self
设置为obj ,使代码可以访问obj的实例变量。
因此send
执行一个方法,而instance_eval
执行任意代码块(作为字符串或块),并将self
设置为您正在调用instance_eval
的对象。
在您的情况下,没有太大的区别,因为您要处理的字符串instance_eval
只是一个方法。 主要区别在于,任何阅读代码的人(包括六个月内的代码)都会想知道为什么要使用instance_eval
来调用单个方法。
无论你使用send
做什么都是instance_eval
的适当子集。 也就是说, send
的参数必须是单个方法(及其参数),而instance_method
的参数是任意代码。 因此,无论何时send
,都可以使用instance_eval
重写它,但反之亦然。
但是,在性能方面, send
比instance_eval
快得多,因为执行send
不需要额外的解析,而instance_eval
需要解析整个参数。
在您的示例中,结果将是相同的,但第一个将运行得更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.