Как << отличается от +?

Я вижу много такого рода в Ruby:

myString = "Hello " << "there!"

Как это отличается от выполнения

myString = "Hello " + "there!"

Ответы

Ответ 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.