Присвоение строки в Ruby не копирует строку неявным образом. Вы просто назначаете другую ссылку на него. Если вы хотите скопировать строку, используйте clone.
Для демонстрации вы можете проверить идентификаторы объектов:
ree-1.8.7-2010.02 > a = "foo"
=> "foo"
ree-1.8.7-2010.02 > b = a
=> "foo"
ree-1.8.7-2010.02 > a.object_id
=> 81728090
ree-1.8.7-2010.02 > b.object_id
=> 81728090
Поскольку a
и b
имеют одинаковый идентификатор объекта, вы знаете, что это один и тот же объект. Если вы хотите изменить b
как копию a
, вы можете использовать методы, которые возвращают новую строку (например, gsub
вместо gsub!
), или вы можете использовать b = a.clone
, а затем работать b
.
ree-1.8.7-2010.02 > a = "foo"
=> "foo"
ree-1.8.7-2010.02 > b = a.clone
=> "foo"
ree-1.8.7-2010.02 > a.object_id
=> 81703030
ree-1.8.7-2010.02 > b.object_id
=> 81696040
ree-1.8.7-2010.02 > b.gsub! "f", "e"
=> "eoo"
ree-1.8.7-2010.02 > a
=> "foo"
ree-1.8.7-2010.02 > b
=> "eoo"
Или проще:
ree-1.8.7-2010.02 > a = "foo"
=> "foo"
ree-1.8.7-2010.02 > b = a.gsub("f", "e")
=> "eoo"
ree-1.8.7-2010.02 > puts a, b
foo
eoo