Меня смущают разные результаты, которые я получаю при выполнении простого сложения/объединения целых чисел, строк и массивов в Ruby. У меня сложилось впечатление, что при присвоении переменной b переменной a (см. ниже) и последующем изменении значения a это b останется прежним. И это происходит в первых двух примерах. Но когда я изменяю массив a в третьем примере, изменяются как a, так и b.
a = 100
b = a
a+= 5
puts a
puts b
a = 'abcd'
b = a
a += 'e'
puts a
puts b
a = [1,2,3,4]
b = a
a << 5
puts a.inspect
puts b.inspect
Вот что было возвращено в Терминале для приведенного выше кода:
Ricks-MacBook-Pro:programs rickthomas$ ruby variablework.rb
105
100
abcde
abcd
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
Ricks-MacBook-Pro:programs rickthomas$
Мой инструктор по программированию дал мне следующее объяснение:
Присвоение чего-либо новой переменной — это просто присвоение ей дополнительной метки, а не копирование.
Похоже, что += — это такой же метод, как и ‹‹, поэтому вы ожидаете, что он будет вести себя аналогично. Но на самом деле это «синтаксический сахар», что-то добавленное в язык для облегчения работы разработчиков.
Когда вы запускаете += 1, Ruby преобразует это в a = a + 1.
В этом случае мы не изменяем Fixnum в файле a. Вместо этого мы на самом деле переназначаем его поверх него, эффективно удаляя предыдущее значение a.
С другой стороны, когда вы запускаете b ‹‹ "c", вы изменяете базовый массив, добавляя к нему строку "c".
Мои вопросы таковы:
1) Он упоминает синтаксический сахар, но разве это не то же самое, что и ‹‹, то есть синтаксический сахар для метода .push?
2) Какая разница, является ли += синтаксическим сахаром или более формальным методом? Если между ними есть какая-то разница, то не означает ли это, что мое ранее понятое понятие синтаксического сахара («синтаксис в языке программирования, предназначенном для облегчения чтения или выражения») неполно, поскольку это не так. t его единственная цель?
3) Если присваивание b переменной a не создает копию a, то почему стирание старого значения a не означает, что старое значение b также стирается во всех трех случаях (целое число, строка и массив)?
Как вы можете видеть, я совсем запутался в том, что, как мне казалось, я понял до сих пор. Любая помощь высоко ценится!