В ruby я хочу сделать примерно следующее и распечатать "изменено":
class Whatever
def change_foo
@foo="changed"
end
end
@foo = "original"
o = Whatever.new
o.change_foo
puts "it changed" if @foo == "changed"
puts "it did not change" if @foo == "original"
Проблема, конечно, в том, что внутри Whatever
, @foo
принадлежит экземпляру Whatever
.
Есть ли способ заставить change_foo
изменить "глобальный" foo? Другой способ задать это может быть: «на какой объект я могу ссылаться, который« владеет »@foo
?».
Мне не нужны такие решения, как «использовать глобальную переменную» или «использовать переменную класса» или «передать @foo
в change_foo
». Я специально спрашиваю о вышеописанном сценарии, где у меня нет контроля ни над исходной переменной, ни над тем, как вызывается change_foo
.
Я нашел обходной путь, в котором я передаю ссылку на глобальный объект во время строительства, но я не без ума от этого, так как для этого требуется, чтобы я создал все, что нужно, в нужном объеме.
class Whatever
def initialize(main)
@main = main
end
def change_foo
@main.instance_variable_set("@foo","changed")
end
end
o = Whatever.new(self)