Как работает оператор присваивания в Ruby? - PullRequest
0 голосов
/ 27 октября 2011

Я пишу простой кусок кода на ruby, но он работает не так, как я ожидал. Я думаю, что эта проблема возникает из-за неправильного понимания того, как работает ruby, в частности, как работает оператор присваивания по сравнению с другими языками. Вот что я написал:

    @instance1 = @clock
    @clock.tick!
    @clock.tick!
    @clock.tick!
    @instance2 = @clock

    puts " instace1.seconds: #{@instance1.seconds}, instance2.seconds: #{@instance2.seconds}"

'Clock' - это класс, имеющий значение в секундах, метод 'tick!' который увеличивает секунды на единицу, и метод 'seconds', который возвращает значение секунд. Секунды инициализируются как 0.

Теперь, когда я запускаю этот код, вывод: "instace1.seconds: 3, instance2.seconds: 3"

Но результат, который я ожидаю получить: "instance1.seconds: 0, instance2.seconds: 3"

Потому что я присвоил intance1 значения, которые @clock имел до Я изменил часы и после этого ничего не сделал для изменения @ instance1.

Для меня это означает, что в некоторых контекстах ruby ​​назначает объекты в качестве указателей и что происходит неявное разыменование. Каковы эти контексты? (переменные класса ?, большие объекты?)

Как сделать явное назначение? Другими словами, как разыменовать переменную?

Как в C, я бы сделал что-то вроде:

*instance1 = *c

(хотя прошло уже много времени с арифметики указателей, так что это грубый пример

1 Ответ

6 голосов
/ 27 октября 2011

Ruby присваивает по ссылке, а не по значению.Что вы можете сделать, это @instance1 = @clock.dup или @instance1 = @clock.clone.

...