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)
任何想法,为什么n是nil在表达n += 1?
n = 1 + n相反,使用引发a TypeError(nil cannot be coerced into Fixnum),n实际上也是如此nil.
即使你已经定义了一个n=方法Foo,Ruby也不会让你在没有明确的接收器的情况下从类中调用它self.n=
所以当你写作时n += 1,这会被翻译成n = n + 1.n=没有明确的接收器,因此Ruby创建了一个局部变量n(即nil).因此nin n + 1指的是一个nil局部变量,给你NoMethodError.
仅供参考,attr_accessor除非您想在课堂外n进行访问,否则您不需要!即便如此,当您编写实例方法时,您应该只使用普通的实例变量.@n
| 归档时间: |
|
| 查看次数: |
379 次 |
| 最近记录: |