Вызовите 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"