Ruby | Изменить ссылку на переменную на ноль - PullRequest
0 голосов
/ 12 марта 2020

У меня есть следующий сценарий:

# Keeps track of all `HomeMadeObject` objects
obj_list = []

# A 2-dimensional matrix of either `nil` or `HomeMadeObject` elements
matrix = ...

# I then add an object like so.
obj = HomeMadeObject.new
matrix[y][x] = obj
obj_list.push(obj)

# Later on, I need to remove 'that same object' from the `matrix`.
matrix[y][x] = nil

Когда я устанавливаю matrix[y][x] в nil, это также повлияет на того же объекта в obj_list, делая его также nil в obj_list.

puts obj_list[0] # nil

Я хотел бы изменить указатель matrix[y][x] (или ссылка ), так что matrix[y][x] указывает на объект nil. Таким образом, obj_list указывает на все правильные объекты, а ячейки matrix могут адресовать различные местоположения без переопределения объекта HomeMadeObject на nil (создание nil элементов в obj_list).

Редактировать

Я хотел бы обновить объекты в obj_list и увидеть обновления в matrix (поэтому мне нужна какая-то ссылка здесь на исходный объект). Но когда HomeMadeObject больше не требуется в matrix, я хочу удалить его только из matrix.

1 Ответ

1 голос
/ 12 марта 2020

Все, что вам нужно понять, это то, что в Ruby все переменные и константы хранят ссылки на объекты. Вот почему нельзя скопировать содержимое, назначив одну переменную другой. Хорошо бы подумать о переменных типа Object в Java или указателях на объекты в C ++. Однако вы не можете изменить значение каждого указателя.

Так что используйте метод dup, когда вы нажимаете на список объектов, ваша проблема решена.

obj_list.push(obj.dup)
...