Я вижу много этого вида этого продолжения в Ruby:
myString = "Hello " << "there!"
Как это отличается от выполнения
myString = "Hello " + "there!"
В Рубине струны мутируются. То есть, значение строки может быть изменено, а не просто заменено другим объектом. x << y
на самом деле добавит строку y к x, а x + y
создаст новую строку и вернет ее.
Это можно проверить просто в рубиновом интерпретаторе:
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 + "там"
возвращает "hellotherethere", но значение x
осталось неизменным. Будьте осторожны с мутирующими строками, они могут прийти и укусить вас. Большинство других управляемых языков не имеют мутируемых строк.
Обратите внимание, что многие методы на строках имеют как разрушительные, так и неразрушительные версии: x.upcase
вернет новую строку, содержащую версию x в верхнем регистре, оставив x в покое; x.upcase!
вернёт заглавное значение - и - изменит объект, на который указывает x.