Ruby backslash, чтобы продолжить строку на новой строке?

Я просматриваю строку кода Ruby в запросе на перенос. Я не уверен, что это ошибка или функция, которую я раньше не видел:

puts "A string of Ruby that"\
  "continues on the next line"

Является ли обратная косая черта допустимым символом для конкатенации этих строк? Или это ошибка?

Ответ 1

Это действительный код.

Обратная косая черта - это продолжение линии. В вашем коде есть два пронумерованных пробега текста; пробелы выглядят как две строки, но на самом деле это всего лишь одна строка, потому что Ruby объединяет пробелы, разделенные пробелами.

Пример трех цитированных прогонов текста, которые на самом деле являются только одной строкой:

"a" "b" "c"
=> "abc"

Пример трех цитированных прогонов текста, которые на самом деле являются только одной строкой, используя / продолжения строки:

"a" \
"b" \
"c"
=> "abc"

Пример трех строк, используя продолжения строки +, а также конкатенации:

"a" +
"b" +
"c"
=> "abc"

Другие подробности продолжения строки: "Ruby интерпретирует точки с запятой и символы новой строки как конец оператора. Однако, если Ruby встречает операторы, такие как +, - или обратная косая черта в конце строки, они указывают на продолжение выражение." - Краткое руководство по Ruby

Ответ 2

Символ обратной косой черты не объединяет никакие строки. Это предотвращает разрыв строки от значения, что эти две строки - разные выражения. Вспомните обратную косую черту как противоположность точки с запятой. Точка с запятой позволяет двум операторам занимать одну строку; обратная косая черта позволяет одному из операторов занимать две строки.

То, что вы не понимаете, состоит в том, что строковый литерал может быть записан как несколько последовательных литералов. Это законный Ruby:

s = "A string of Ruby that" "continues on the same line"
puts s

Так как это законно, законно поместить разрыв строки между двумя строковыми литералами, но тогда вам понадобится обратная косая черта, символ продолжения строки, чтобы сообщить Ruby, что это на самом деле одно и то же утверждение, распространяемое на два линии.

s = "A string of Ruby that" \
"continues on the same line"
puts s

Если вы опускаете обратную косую черту, это все еще законно, но не дает результата, на который вы могли бы надеяться; строковый литерал на второй строке просто выброшен.

Ответ 3

Это не относится к конкатенированным строкам. Это одна строка. "foo" "bar" - это синтаксическая конструкция, которая позволяет разбить строку в вашем коде, но она идентична "foobar". Напротив, "foo" + "bar" является истинным конкатенацией, вызывая метод конкатенации + на объекте "foo".

Вы можете проверить это, сбросив инструкции YARV. Для сравнения:

RubyVM::InstructionSequence.compile('"foo" + "bar"').to_a
// .... [:putstring, "foo"], [:putstring, "bar"] ....
RubyVM::InstructionSequence.compile('"foo" "bar"').to_a
// .... [:putstring, "foobar"] ....

Обратная косая черта перед новой строкой отменяет новую строку, поэтому она не прерывает утверждение; без него это не будет одна строка, а две строки в отдельных строках.