Ruby attr_reader和+ =

Nic*_*lev 3 ruby attr-accessor

我最近被以下代码难住了:

class Foo
  attr_accessor :n

  def initialize(i)
    @n = i
  end

  def val
    n
  end

  def bump!
    n += 1
  end
end

f = Foo.new(0)

puts f.val
f.bump!
Run Code Online (Sandbox Code Playgroud)

puts f.val成功并按0预期打印出来.f.bump!导致以下情况NoMethodError

foo.rb:13:in `bump!': undefined method `+' for nil:NilClass (NoMethodError)
        from foo.rb:20:in `<main>'
Run Code Online (Sandbox Code Playgroud)

任何想法,为什么nnil在表达n += 1

n = 1 + n相反,使用引发a TypeError(nil cannot be coerced into Fixnum),n实际上也是如此nil.

Max*_*Max 8

即使你已经定义了一个n=方法Foo,Ruby也不会让你没有明确的接收器的情况下从类中调用它self.n=

所以当你写作时n += 1,这会被翻译成n = n + 1.n=没有明确的接收器,因此Ruby创建了一个局部变量n(即nil).因此nin n + 1指的是一个nil局部变量,给你NoMethodError.

仅供参考,attr_accessor除非您想在课堂n进行访问,否则您不需要!即便如此,当您编写实例方法时,您应该只使用普通的实例变量.@n

  • 我认为值得一提的是,Ruby需要接收器的原因是专门允许像这样创建局部变量.否则,在定义`attr_writer`之后创建局部变量是不可能的. (2认同)