LINUX.ORG.RU

[Ruby] Странные массивы

 


0

0

Почему одинаковые массивы ведут себя по разному?

хочу сделать двумерный массив а потом заменить там один элемент в одном подмассиве: ts = [([0]*15)] + [([0]*15)] + [([0]*15)] (ts[0])[3] = 3 p ts - выдает то что мне нада

создаю этот же массив по-другому ts = [([0]*15)]*3 (ts[0])[3] = 3 p ts

он менят во ВСЕХ подмассивах этот элемент

p [([0]*15)]*3 == [([0]*15)] + [([0]*15)] + [([0]*15)] -> true

Перемещено JB из Talks


Очевидно, в первом случае каждый элемент массива --- ссылка на отдельный объект. А во втором каждый элемент ссылается на один и тот же объект.

//Руби не знаю

Zenom ★★★
()

Полагаю, что как и в питоне, в раби массив mutable.

То есть, в данной ситуации хранятся только ссылки. Чтобы сделать копию массива использую метод .copy или подобный.

Davidov ★★★★
()

> p [([0]*15)]*3 == [([0]*15)] + [([0]*15)] + [([0]*15)] -> true

Ты сравни id объектов в массивах и тебе станет ясно, в чем проблема и почему это выражение возвращает true, а поведение массивов не такое, как ты ожидаешь.

smh ★★★
()

Солидарен с предыдущими ораторами, дело в объектах(в данном случае immutable) и в ссылках на них. В одном случае создается несколько разных объектов и в массиве присутствуют ссылки на разные объекты, а в другом создается один массив, а на него куча ссылок.

balodja ★★★
()
Ответ на: комментарий от balodja

*создается один объект, а в массиве присутствует куча ссылок.

PS. Где кнопка "Править"?

balodja ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.