0

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

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 上尝试过,结果相同。

4

1 回答 1

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

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

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

于 2013-01-04T05:17:52.127 回答