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

Ruby backslash to continue string on a new line?

我正在审查拉取请求中的一行 Ruby 代码。我不确定这是一个错误还是我以前从未见过的功能:

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

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

这是有效代码。

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

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

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

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

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

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

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

其他行继续详细信息:"Ruby interprets semicolons and newline characters as the ending of a statement. However, if Ruby encounters operators, such as +, -, or backslash at the end of a line, they indicate the continuation of a statement." - Ruby Quick Guide

这不是串联字符串的情况。它是一个单独的字符串。 "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"] ....

换行前的反斜杠会取消换行,所以不会终止语句;没有它,它就不是一个字符串,而是两个不同行的字符串。

反斜杠字符不连接任何字符串。它防止换行符意味着这两行是不同的语句。将反斜杠视为分号的反义词。分号让两条语句占一行;反斜杠让一条语句占两行。

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

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