attr_reader,attr_accessor功能未按预期工作

时间:2014-02-24 06:00:22

标签: ruby methods instance-variables attr

我刚读完POODR的前几章。作者展示了attr_reader(访问器)的一个特性,它允许您在声明它们之后在引用实例变量时消除对'@'的需要,此外还有更为人熟知的attr_特性。

但是,GuessingGame#解决了吗?代码只有在我使用'@guess'引用最近的“猜测”时才有效,而不是像我期望的那样简单地“猜测”。我的倾向是我有一个方法#guess,而Ruby正在考虑我在调用这个方法?这是对的吗?

非常感谢任何澄清。

class GuessingGame
  attr_reader :answer
  attr_accessor :guess

  def initialize(answer)
    answer.is_a?(Integer) ? (@answer = answer) : (raise ArgumentError.new "You must enter an Integer.")
  end

  def guess(guess)
    @guess = guess
    if guess > answer
      :high
    elsif guess < answer
      :low
    else
      :correct
    end
  end

  def solved?
    @guess == answer
  end
end

1 个答案:

答案 0 :(得分:4)

你的怀疑是正确的。

代码:

attr_accessor :guess

相当于:

def guess
  @guess
end

def guess=(new_value)
  @guess = new_value
end

也就是说,它创建了一个获取实例变量值的方法和另一个设置实例变量值的方法。

以后重新定义方法guess时,会覆盖attr_accessor隐式定义的方法

def guess
  3
end

def guess
  4
end

guess
#=> 4