gpt4 book ai didi

Ruby attr_reader 和 +=

转载 作者:数据小太阳 更新时间:2023-10-29 07:45:10 25 4
gpt4 key购买 nike

我最近被下面的代码难住了:

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!

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

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

知道为什么 n 在表达式 n += 1 中是 nil 吗?

使用 n = 1 + n 会引发一个 TypeError(nil 不能被强制转换为 Fixnum),所以 n 实际上是 nil

最佳答案

即使您已经为 Foo 定义了一个 n= 方法,Ruby 也不允许您在类中 调用它显式接收器,即 self.n=

因此,当您编写 n += 1 时,它会被翻译成 n = n + 1n= 没有明确的接收者,因此 Ruby 创建了一个局部变量 n(即 nil)。因此 n + 1 中的 n 指的是一个 nil 局部变量,给你 NoMethodError

仅供引用,您不需要attr_accessor,除非您希望n 可以在类之外 访问!即使这样,当您编写实例方法时,您也应该只使用普通的实例变量 @n

关于Ruby attr_reader 和 +=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20124296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com