Ответ 1
В Ruby строки изменяемы. То есть, строковое значение может быть фактически изменено, а не просто заменено другим объектом. x << y
фактически добавит строку y к x, а x + y
создаст новую строку и вернет ее.
Это можно протестировать просто в интерпретаторе ruby:
irb(main):001:0> x = "hello"
=> "hello"
irb(main):002:0> x << "there"
=> "hellothere"
irb(main):003:0> x
=> "hellothere"
irb(main):004:0> x + "there"
=> "hellotherethere"
irb(main):005:0> x
=> "hellothere"
Заметьте, что x + "there"
вернулся "helloherethere", но значение x
не изменилось. Будьте осторожны с изменчивыми струнами, они могут прийти и укусить вас. Большинство других управляемых языков не имеют изменяемых строк.
Обратите внимание также, что многие из методов в String имеют как разрушительные, так и неразрушающие версии: x.upcase
вернет новую строку, содержащую версию x в верхнем регистре, оставив x только; x.upcase!
вернет значение с верхним индексом и изменит объект, на который указывает x.