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

时间:2014-05-22 15:31:22

标签: ruby string concatenation behavior

为什么这在Ruby中起作用:

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

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

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

2 个答案:

答案 0 :(得分:49)

在C和C ++中,string literals彼此相邻are concatenated。由于这些语言影响了Ruby,我猜它会从那里继承。

现在Ruby中有记录:请参阅this answerthis page in the Ruby repo,其中说明:

  

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

"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

答案 1 :(得分:34)

实现细节可以在Ruby源代码的parse.y文件中找到。具体而言,here

Ruby stringtCHAR(例如?q),string1(例如“q”,“q”或%q {q}) ,或string1string本身串联的递归定义,这会导致串联"foo" "bar"'foo' "bar"?f "oo" 'bar'等字符串表达式。