my_var_a
и my_var_set
- это разные ссылки, но они указывают на один и тот же объект. Если вы измените объект в my_var_set
, изменение отобразится в my_var_a
. Однако, если вы назначите my_var_set
новому объекту, это не изменит то, на что указывает my_var_a
.
Редактировать: уточнение ...
То, что делает Ruby, называется передачей ссылок по значению. Когда вы говорите
my_var_a = "nothing happend to me"
Ruby сохраняет строку «ничего не случилось со мной» в ячейке памяти (назовем ее 1000) и сохраняет ссылку my_var_a
в другую ячейку памяти (скажем, 2000). Когда ваш код использует my_var_a
, интерпретатор смотрит на местоположение 2000, видит, что оно указывает на 1000, а затем получает фактическое строковое значение из 1000.
Когда вы вызываете parse_set(my_var_a)
, Ruby фактически создает новую ссылку с именем my_var_set
и указывает ее на строку, на которую указывал my_var_a
(область памяти 1000). Тем не менее, my_var_set
является копией ссылки my_var_a
- скажем, my_var_set
был создан в ячейке памяти 3000. my_var_a
и my_var_set
- это две совершенно разные ссылки в памяти, они просто указывают на та же самая точная ячейка памяти, которая содержит строковое значение.
Оператор my_var_set = "my value changed"
в parse_set
создает новую строку в памяти и указывает my_var_set
на эту новую ячейку памяти. Однако это не меняет того, на что указывают исходные my_var_a
ориентиры! Теперь, когда my_var_set
указывает на другое место в памяти, ничего, что вы делаете с этой переменной, не повлияет на my_var_a
.
Та же самая справочная копия существует и для parse_sub
. Но причина того, что parse_sub
изменяет строку, заключается в том, что вы вызываете метод непосредственно по ссылке my_var_sub
. Когда вы делаете это, интерпретатор получает объект, на который указывает my_var_sub
, и затем изменяет его. Таким образом, это изменение будет отображаться в справочнике my_var_a
, поскольку оно все еще указывает на ту же строку.