为什么instance_eval以特殊方式处理直接访问器?

时间:2013-01-04 05:16:05

标签: ruby instance-eval

为什么以下代码不会引发错误:

Object.new.instance_eval { some_accessor_that_does_not_exist= "a value" }

虽然以下内容会引发您想要的NameError:

Object.new.instance_eval { some_method_that_doesnt_exist }

即使这会引发错误:

Object.new.instance_eval { self.some_accessor_that_does_not_exist= "a value" }

我在1.8.7-p352以及1.9.3-p194上尝试了相同的结果。

1 个答案:

答案 0 :(得分:1)

Object.new.instance_eval { some_accessor_that_does_not_exist= "a value" }

这被解释为创建名为some_accessor_that_does_not_exist的新本地var,而不是setter调用。当您使用具有隐式接收器的赋值时,ruby无法知道您是要创建本地var还是调用方法,因为没有用于声明本地变量的特殊语法。因此它创建了一个局部变量。

但是当你使用显式接收器(self.some_accessor_that_does_not_exist)时,ruby会将其解释为方法并失败。