Ruby反斜杠继续在新行上串?

我正在审查拉取请求中的一行Ruby代码。 我不确定这是否是我以前没见过的错误或function:

puts "A string of Ruby that"\ "continues on the next line" 

反斜杠是连接这些字符串的有效字符吗? 或者这是一个错误?

那是有效的代码。

反斜杠是一个续行。 您的代码有两个引用的文本行; 这些运行看起来像两个字符串,但实际上只是一个字符串,因为Ruby连接了以空格分隔的运行。

三个引用文本的示例,实际上只是一个字符串:

 "a" "b" "c" => "abc" 

三个引用的文本运行示例,它们实际上只是一个字符串,使用/ line continuations:

 "a" \ "b" \ "c" => "abc" 

三个字符串的示例,使用+行连续和连接:

 "a" + "b" + "c" => "abc" 

其他行继续细节:“Ruby将分号和换行符解释为语句的结尾。但是,如果Ruby遇到运算符,例如+, – 或行末尾的反斜杠,则表示语句的延续。” – Ruby快速指南

反斜杠字符不会连接任何字符串。 它可以防止换行意味着这两行是不同的语句。 把反斜杠想象成分号的反面。 分号允许两个语句占据一行; 反斜杠允许一个语句占用两行。

你没有意识到的是,字符串文字可以写成多个连续的文字。 这是合法的Ruby:

 s = "A string of Ruby that" "continues on the same line" puts s 

既然这是合法的,那么在两个字符串文字之间放置一个换行符是合法的 – 但是你需要反斜杠,行继续符,告诉Ruby这些实际上是相同的语句,分布在两行。

 s = "A string of Ruby that" \ "continues on the same line" puts s 

如果省略反斜杠,它仍然是合法的,但不会给出您可能希望的结果; 第二行的字符串文字被简单地扔掉了。

这不是连接字符串的情况。 这是一个单一的字符串。 "foo" "bar"是一种语法结构,允许您在代码中分解字符串,但它与"foobar"相同。 相反, "foo" + "bar"是真正的连接,在对象"foo"上调用连接方法+

您可以通过转储YARV指令来validation这一点。 相比:

 RubyVM::InstructionSequence.compile('"foo" + "bar"').to_a // .... [:putstring, "foo"], [:putstring, "bar"] .... RubyVM::InstructionSequence.compile('"foo" "bar"').to_a // .... [:putstring, "foobar"] .... 

换行符前面的反斜杠将取消换行符,因此它不会终止该语句; 没有它,它不会是一个字符串,而是两个字符串在不同的行中。