为什么以下代码不会引发错误:
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上尝试了相同的结果。
答案 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会将其解释为方法并失败。