Почему две строки, разделенные пространством, объединены в Ruby?

Почему это работает в Ruby:

"foo" "bar"
# => "foobar"

Я не уверен, почему строки были объединены вместо синтаксической ошибки.

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

Ответ 1

Подробности реализации можно найти в файле parse.y в исходном коде Ruby. В частности, здесь.

A Ruby string является либо tCHAR (например, ?q), a string1 (например, "q", "q" или% q (q)), или рекурсивным определением конкатенации из string1 и string, что приводит к конкатенированию строковых выражений, таких как "foo" "bar", 'foo' "bar" или ?f "oo" 'bar'.

Ответ 2

В C и С++ строковые литералы рядом друг с другом объединяются. Поскольку эти языки повлияли на Ruby, я бы предположил, что он наследуется оттуда.

И теперь это описано в Ruby: см. этот ответ и эта страница в Ruby репо, в котором говорится:

Смежные строковые литералы автоматически конкатенируются интерпретатором:

"con" "cat" "en" "at" "ion" #=> "concatenation"
"This string contains "\
"no newlines."              #=> "This string contains no newlines."

Любая комбинация смежных строк с одной кавычкой, двойной кавычкой, процентами будет конкатенирована до тех пор, пока процентная строка не будет последней.

%q{a} 'b' "c" #=> "abc"
"a" 'b' %q{c} #=> NameError: uninitialized constant q