Я обнаружил странную ошибку в моем коде, которая обнаружила интересное поведение ruby. Надеюсь, кто-то может объяснить, почему он так себя ведет.
У меня был класс с переменной экземпляра @foo и метод, который ссылался на локальную переменную scoo. Я рефакторил часть метода, случайно оставив ссылку на 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, или что-то не так?