Используйте\вместо + или <<, чтобы объединить эти строки

Я использую rubocop для очистки моего грязного кода...

Одна из ошибок:

Используйте\вместо + или < < чтобы объединить эти строки.

Почему это?

Я не могу найти его в документации Ruby. Почему я должен использовать \ вместо + или <<?

Ответы

Ответ 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-программисты делают это именно так.

Ответ 2

\ в конце строки остановит интерпретатор от обработки новой строки как конца инструкции. Таким образом, вы можете создать многострочную строку, не используя затраты на конкатенацию или добавление.