Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Ruby中两个空格分隔的字符串连接在一起?_Ruby_String_Concatenation_Behavior - Fatal编程技术网

为什么在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"

为什么这在Ruby中有效:

"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背景有关。