Ответ 1
В Ruby литеральные строки выделяются как объекты в памяти, когда они встречаются. Если вы объедините два строковых литерала, как в
str = "foo" + "bar"
вы фактически выделите три объекта String
: "foo"
, "bar"
и результат конкатенации (который затем называется str
).
То же самое происходит, если вы делаете:
"foo" << "bar"
Во многих случаях это лишь незначительная неэффективность, о которой вы не должны слишком беспокоиться.
Однако имейте в виду, что если вы сделаете это в цикле, и если агрегат String
станет большим, вы будете выделять все более крупный объект String
на каждой итерации (вы можете избежать этого, собирая строковые части в Array
, а затем вызывая join
, когда вы закончите, а также foo << 'bar'
изменит foo
на месте, что приемлемо в цикле).
Используя \
, вы не объединяете промежуточные объекты, а вместо этого эффективно представляете синтаксический анализатор одним литералом String
(потому что \
просто продолжает строку на следующей строке).
Идиома "foo" + "bar" + "baz"
часто используется в Java, где строки неизменяемы, а литералы объединяются во время компиляции. (Каждый строковый литерал в Java хранится только один раз, а затем повторно используется во всем коде, Ruby этого не делает.) Кроме того, у Java нет лучшего способа продолжить строки по нескольким строкам, поэтому Java-программисты делают это именно так.