【发布时间】:2011-10-29 11:06:23
【问题描述】:
我在代码中发现了一个奇怪的错误,它揭示了 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 的输出是“那是一个美味的汉堡”。我原以为会有错误,例如运行上面的代码会得到 p>
NameError: undefined local variable or method
我什至请了一位更资深的开发人员来看看,他有些困惑并确认了这种行为。
这是预期的行为,我误解了@variables 的工作原理还是有什么问题?
【问题讨论】:
-
很奇怪。没有
attr_reader :foo隐藏在某处,是吗?你没有误会什么。如果def foo; @foo end未定义(显式或通过attr_reader或attr_accessor),则foo不应返回@foo -
啊哈!我刚查了一下,确实有一个 attr_accessor :foo.
-
不错 :) 必须注意那些神奇的方法。将其中一个答案与一个点挂钩:-P
-
我还没有足够的声望给积分:(
标签: ruby scope scope-resolution narwhal