В 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"
вернул "hellotherethere", но значение x
не изменилось. Будьте осторожны с изменяемыми нитями, они могут прийти и укусить вас. Большинство других управляемых языков не имеют изменяемых строк.
Обратите внимание, что многие методы в String имеют как деструктивные, так и неразрушающие версии: x.upcase
вернет новую строку, содержащую версию x в верхнем регистре, оставив x в покое; x.upcase!
вернет значение в верхнем регистре и изменит объект, на который указывает x.