我知道send方法可以带字符串或符号作为参数调用,而instance_eval方法可以接受字符串或块作为参数,并且它们之间的区别可以根据接收者的不同变得明显。
我的问题是下面这个例子的具体实现方式有什么不同?
1234.send 'to_s' # '1234'
1234.instance_eval 'to_s' # '1234'
我知道send方法可以带字符串或符号作为参数调用,而instance_eval方法可以接受字符串或块作为参数,并且它们之间的区别可以根据接收者的不同变得明显。
我的问题是下面这个例子的具体实现方式有什么不同?
1234.send 'to_s' # '1234'
1234.instance_eval 'to_s' # '1234'
从精细手册得知:
send(symbol [, 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
传递的字符串只是一个单一的方法,所以两者并没有太大差别。主要区别在于读取你的代码(包括6个月后的你)的人会想知道为什么你要使用instance_eval
来调用单个方法。
您可能也对Object#public_send
和BasicObject#__send__
感兴趣。
send
方法的功能是instance_eval
方法的一个子集。简而言之,send
方法的参数必须是单个方法(及其参数),而instance_eval
方法的参数可以是任意代码。因此,每当您使用send
时,都可以使用instance_eval
进行重写,但反之则不行。
然而,从性能上来讲,send
比instance_eval
更快速,因为执行send
时不需要进行额外的解析,而instance_eval
需要解析整个参数。
在您的示例中,结果将相同,但第一个方法会运行得更快。
instance_eval
方法。 - Skiptomylu