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

And*_*rew 25 ruby

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

puts "A string of Ruby that"\
  "continues on the next line"
Run Code Online (Sandbox Code Playgroud)

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

joe*_*son 25

那是有效的代码.

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

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

"a" "b" "c"
=> "abc"
Run Code Online (Sandbox Code Playgroud)

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

"a" \
"b" \
"c"
=> "abc"
Run Code Online (Sandbox Code Playgroud)

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

"a" +
"b" +
"c"
=> "abc"
Run Code Online (Sandbox Code Playgroud)

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

  • 疯狂的。“如果 Ruby 在行尾遇到诸如 +、- 或反斜杠之类的运算符,它们表示语句的继续。” http://www.tutorialspoint.com/ruby/ruby_quick_guide.htm (2认同)
  • **注意:** `+` 继续 **语句**,但不继续 **字符串**。`puts "foo"+"bar".upcase` 为您提供 `fooBAR`,而 `puts ("foo"+"bar").upcase` 为您提供 `FOOBAR`。(无论 `+` 之后是否有换行符。) **但是:** 如果您使用反斜杠而不是加号,它_总是_会给您 `FOOBAR`,因为将行组合成一个语句,然后组合将连续的字符串合并为一个字符串,发生在调用 string 方法之前。当您尝试以颜色打印字符串时,可能会发生这种情况,例如在字符串末尾使用“.red”:-) (2认同)

mat*_*att 21

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

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

s = "A string of Ruby that" "continues on the same line"
puts s
Run Code Online (Sandbox Code Playgroud)

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

s = "A string of Ruby that" \
"continues on the same line"
puts s
Run Code Online (Sandbox Code Playgroud)

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

  • "反斜杠与分号相反":美丽的理解. (4认同)

Ama*_*dan 7

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

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

RubyVM::InstructionSequence.compile('"foo" + "bar"').to_a
// .... [:putstring, "foo"], [:putstring, "bar"] ....
RubyVM::InstructionSequence.compile('"foo" "bar"').to_a
// .... [:putstring, "foobar"] ....
Run Code Online (Sandbox Code Playgroud)

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