instance_eval不适用于att_accessor?

fre*_*eze 0 ruby block instance-eval

任何人都可以说我,为什么这不起作用:

class A
  attr_accessor :b
end

a = A.new
a.instance_eval do
  b = 2
end

a.b
=> nil
Run Code Online (Sandbox Code Playgroud)

我在做什么错了?

Hol*_*ust 6

罪魁祸首在于这部分代码:

a.instance_eval do
  b = 2
end
Run Code Online (Sandbox Code Playgroud)

虽然b = 2在您的实例的上下文中进行评估,但它不会调用setter.相反,它只是创建一个b在当前范围内调用的新局部变量.要调用setter,您必须进一步澄清代码以解决歧义:

a.instance_eval do
  self.b = 2
end
Run Code Online (Sandbox Code Playgroud)