ruby - attr_reader、attr_accessor 功能未按预期工作

标签 ruby methods instance-variables attr

我刚看完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/

相关文章:

ruby - 是否可以将 `retry` 关键字与 `if` 内联使用?

ruby - 正则表达式只匹配空格

java - 如何让 Java 在继续之前等待方法完成?

javascript 对象,切换不同属性值的方法和努力编写 DRY 代码

ruby - 如何通过将字符串作为方法名称来调用 ruby​​ 对象的方法

ruby-on-rails - shopify_app 语法错误

java - 有没有办法在类之间使用方法?

ruby-on-rails - Rails - 从应用程序中的任何地方调用实例变量

java - 将标签(对象名称)添加到实例对象