Ruby の興味深い動作を明らかにする奇妙なバグをコードで見つけました。うまくいけば、誰かがこのように動作する理由を説明できます。
インスタンス変数 @foo を持つクラスと、ローカル スコープの変数 foo を参照するメソッドがありました。メソッドの一部を誤って foo への参照を残してリファクタリングしました。スコープで定義されなくなった変数。代わりに @foo を指すことになりました。foo を変更すると @foo が変更され、その逆も同様です。
簡易版: EDIT : 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 の仕組みを誤解していますか、それとも何か問題がありますか?