gpt4 book ai didi

ruby - 为什么这个变量在结构中消失了?

转载 作者:太空宇宙 更新时间:2023-11-03 17:58:04 25 4
gpt4 key购买 nike

也许我只是对结构体了解不够,一直在盲目地使用它们,但下面的结果对我来说似乎不合理。

class VarTest < Struct.new(:email)
def perform
puts "Start: #{email}"
if email == "nothing"
email = "bad email"
end
puts "End: #{email}"
end
end
VarTest.new("test@example.com").perform

意外输出:

Start: test@example.com
End:

如果我将代码更改为:

class VarTest < Struct.new(:email)
def perform
e = email
puts "Start: #{e}"
if e == "nothing"
e = "bad email"
end
puts "End: #{e}"
end
end

VarTest.new("test@example.com").perform

我们得到了预期的输出:

Start: test@example.com
End: test@example.com

有人可以解释一下这是怎么回事吗?

谢谢。

最佳答案

如果将 email = "bad email" 替换为 self.email = "bad email",它将按预期工作。使用 setter 时总是如此。

原因很简单:当 Ruby 遇到裸字时,它会尝试将其解析为本地变量。如果没有,它将尝试调用该名称的方法。在类体内 self 是隐式的接收者,所以读者只是工作。现在对于作家来说有一个问题。如果您编写类似 foo = "bar" 的内容,Ruby 将创建一个新的局部变量,因此您需要明确接收者。

这种情况有点棘手:if email == "nothing" 使用 getter。但是,email = "bad email" 仍然会被解析器识别,并且局部变量 email 将被设置为 nil。当解析器将裸字视为赋值的 LHS 时,总是会发生这种情况。这个本地 nil 值使 email 的值看起来消失了(您可以通过仅将最后一个 puts 更改为 放“结束:#{self.email}”)。

关于ruby - 为什么这个变量在结构中消失了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9856556/

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