为什么在Ruby中两个空格分隔的字符串连接在一起?
为什么这在Ruby中有效:为什么在Ruby中两个空格分隔的字符串连接在一起?,ruby,string,concatenation,behavior,Ruby,String,Concatenation,Behavior,为什么这在Ruby中有效: "foo" "bar" # => "foobar" 我不确定为什么字符串被连接,而不是给出语法错误 我很好奇,这是否是预期的行为,是否是语法分析器负责争论的东西(没有操作符的两个字符串被认为是一个字符串),或者语言定义本身在C和C++中指定这个行为(隐式CONTAT)。由于这些语言影响了Ruby,我猜它是从那里继承下来的 Ruby now中记录了它:请参阅,其中说明: 解释器会自动连接相邻的字符串文字: "con" "cat" "en" "at" "ion"
"foo" "bar"
# => "foobar"
我不确定为什么字符串被连接,而不是给出语法错误
我很好奇,这是否是预期的行为,是否是语法分析器负责争论的东西(没有操作符的两个字符串被认为是一个字符串),或者语言定义本身在C和C++中指定这个行为(隐式CONTAT)。由于这些语言影响了Ruby,我猜它是从那里继承下来的
Ruby now中记录了它:请参阅,其中说明:
解释器会自动连接相邻的字符串文字:
"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
实现细节可以在Ruby源代码的
parse.y
文件中找到。具体来说
Ruby
字符串
可以是tCHAR
(例如?q
)、string1
(例如“q”、“q”或%q{q}),也可以是string1
和字符串
本身串联的递归定义,这会导致字符串表达式,如“foo”“bar”
、“foo”“bar”
或“bar”
被连接。+1用于引用文档,但我认为重要信息可能应该添加到答案中。我找不出合适的术语来搜索“字符串文字并置”。谢谢。这个特性存在于许多语言中(大概都是从C语言中借用的),在将长字符串包装到多行时非常有用。它也不同于在“编译”时简单地连接字符串(使用+、&或语言使用的任何东西),因此它仍然是一个字符串文本,而不是在运行时计算的表达式。实际上,“只要百分比字符串不是最后一个”并不反映实际行为。根据我的尝试,连接抛出了一个语法错误,意外的tSTRING\u BEG,当百分比字符串不是第一个,也不是最后一个时,期望输入结束,就像“a”%q{b}“c”
。这一发现值得称赞。似乎是与解析器相关的“特性”。在这里接受这一个作为对正,而不是一组链接。“a”'b“%q{c}#=>NameError:未初始化常量q为什么会导致错误?@IngridMorstrad,因为%被视为模数运算符,而不是字符串文字的一部分。作为一个二进制运算符,您提到的表达式被解析为'ab%%(q{c})
,块{c}
传递给q
,而该块(可能)不存在,因此会出现错误。Python测试中也会发生同样的情况。正如JKillian所说,它必须与两种语言共享的C背景有关。