为什么用空格分隔的两个字符串在Ruby中连接?

Luk*_*kas 44 ruby string behavior concatenation

为什么这在Ruby中有效:

"foo" "bar"
# => "foobar"
Run Code Online (Sandbox Code Playgroud)

我不确定为什么字符串被连接而不是给出语法错误.

我很好奇这是否是预期的行为,以及它是否是解析器负责争吵的东西(没有运算符的两个字符串被认为是单个字符串)或者语言定义本身指定了这种行为(隐式concat).

JKi*_*ian 50

在C和C++,字符串文字彼此相邻是级联.由于这些语言影响了Ruby,我猜它会从那里继承.

现在在Ruby中有记录:请参阅Ruby repo中的这个答案这个页面:

相邻的字符串文字由解释器自动连接:

"con" "cat" "en" "at" "ion" #=> "concatenation"
"This string contains "\
"no newlines."              #=> "This string contains no newlines."
Run Code Online (Sandbox Code Playgroud)

只要百分比字符串不是最后一个,相邻的单引号,双引号,百分比字符串的任何组合都将连接在一起.

%q{a} 'b' "c" #=> "abc"
"a" 'b' %q{c} #=> NameError: uninitialized constant q
Run Code Online (Sandbox Code Playgroud)

  • +1 用于引用文档,但我认为重要信息可能应该添加到答案中。我想不出好词来搜索“字符串文字并列”。谢谢。 (2认同)
  • 此功能存在于许多语言中(可能都是从C中借用它),并且在将多个字符串包装在多行上时非常有用.它与简单地连接字符串(使用+,和/或语言使用的任何东西)不同,因为它发生在"编译"时,因此它仍然是字符串文字,而不是在运行时评估的表达式. (2认同)

Ahm*_*rif 34

实现细节可以parse.y在Ruby源代码的文件中找到.具体来说,这里.

一个Ruby string或者是tCHAR(例如?q),一个string1(例如,"Q","Q",或%Q {Q}),或的级联的递归定义string1string本身,这导致字符串表达式等"foo" "bar",'foo' "bar"或者?f "oo" 'bar'是级联.

  • "a"'b'%q {c}#=> NameError:未初始化的常数q为什么这会导致错误呢? (2认同)
  • @IngridMorstrad 因为 % 被认为是模数运算符,而不是字符串文字的一部分。作为一个二元运算符,你提到的表达式被解析为 `'ab' % (q{c})`,块 `{c}` 传递给不存在的 `q`(大概),因此错误. (2认同)