instance_eval不适用于att_accessor?

时间:2012-03-25 11:39:57

标签: ruby block instance-eval

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

class A
  attr_accessor :b
end

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

a.b
=> nil

我在做什么错?

2 个答案:

答案 0 :(得分:6)

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

a.instance_eval do
  b = 2
end

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

a.instance_eval do
  self.b = 2
end

答案 1 :(得分:0)

变化:

a.instance_eval do
  self.b = 2
end