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

时间:2015-01-06 05:19:18

标签: ruby

我在拉取请求中查看了一行Ruby代码。我不确定这是否是我之前未见过的错误或功能:

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

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

3 个答案:

答案 0 :(得分:20)

这是有效的代码。

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

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

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

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

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

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

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

其他行继续详细信息:" Ruby将分号和换行符解释为语句的结尾。但是,如果Ruby遇到运算符,例如+, - 或行尾的反斜杠,则表示语句的延续。" - Ruby Quick Guide

答案 1 :(得分:17)

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

你没有意识到,字符串文字可以写成多个连续的文字。这是合法的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

如果省略反斜杠,它仍然是合法的,但是没有给出你可能希望得到的结果;第二行的字符串文字就被丢弃了。

答案 2 :(得分:4)

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

您可以通过转储YARV说明来验证这一点。比较:

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

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