我刚看完POODR的前几章.作者展示了 attr_reader(accessor) 的一个特性,除了 attr_ 的广为人知的特性之外,它还允许您在声明实例变量后引用它们时消除对“@”的需要。
但是,猜猜游戏#解决了吗?该代码仅在我使用“@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
最佳答案
你的怀疑是正确的。
代码:
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
关于ruby - attr_reader、attr_accessor 功能未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21979996/