我在代码中发现了一个奇怪的错误,它揭示了 ruby 的一个有趣行为。希望有人可以解释为什么它会这样。
我有一个带有实例变量 @foo 的类和一个引用局部范围变量 foo 的方法。我重构了部分方法,不小心留下了对 foo 的引用;该变量不再定义在范围内。它最终指向@foo。更改 foo 会更改 @foo ,反之亦然。
简化版:编辑:添加了 ImOutOfNames。
class ImOutOfNames
attr_accessor :foo # the culprit!
end
class Bar < ImOutOfNames
def initialize
@foo = "that is a tasty burger"
end
def bar_method_1
foo = "Come on Yolanda, whats Fonzie like?"
bar_method_2
end
def bar_method_2
puts foo
end
end
bar_method_1 和 bar_method_2 的输出是“那是一个美味的汉堡”。我期待会有一个错误,例如运行上面的代码得到
NameError: undefined local variable or method
我什至请了一位更资深的开发人员来看看,他有些困惑并确认了这种行为。
这是预期的行为,我误解了@variables 的工作原理还是有什么问题?