Как предотвратить алиасинг в ruby? - PullRequest
0 голосов
/ 06 февраля 2020

Я хочу скопировать массив в новый массив, а затем изменить значения во втором массиве без применения первого массива.

Пример этого:

my_arr = [1,2,3,4,5]
copy_arr = my_arr
copy_arr[0]*=2

my_arr    //  [2,2,3,4,5]
copy_arr  //  [2,2,3,4,5]

Я изменил только copy_arr, но изменились и массив my_arr и copy_arr. В Ruby, присваивании псевдонимов объектам, несколько переменных ссылаются на один и тот же объект.
Как я могу назначить переменную, чтобы она не могла создавать псевдонимы, которые могут решить мою проблему ??

1 Ответ

3 голосов
/ 06 февраля 2020

Вызовите dup для дублирования массива:

my_arr = [1, 2, 3, 4, 5]
copy_arr = my_arr.dup     # <- here

copy_arr[0] *= 2

my_arr   #=> [1, 2, 3, 4, 5]
copy_arr #=> [2, 2, 3, 4, 5]

Обратите внимание, что это не сглаживание (в терминах Ruby). Ваши переменные просто ссылались на один и тот же объект. Вы попросили объект изменить свой первый элемент, вызвав []=, и, как следствие, изменение было отражено обеими переменными. Другими словами: вы изменили объект, а не переменные.

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

foo = 123
bar = foo

foo #=> 123
bar #=> 123

bar = "hello"      # <- only changes bar, not foo

foo #=> 123
bar #=> "hello"

Это очень отличается от фактического alias в Ruby:

$foo = 123
alias $bar $foo

$foo #=> 123
$bar #=> 123

$bar = "hello"     # <- changes both, $foo and $bar

$foo #=> "hello"
$bar #=> "hello"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...