我正在审查拉取请求中的一行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快速指南
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)
如果省略反斜杠,它仍然是合法的,但不会给出您可能希望的结果; 第二行的字符串文字被简单地扔掉了.
这不是串联字符串的情况。它是一个字符串。"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)
换行符前面的反斜杠将取消换行符,因此它不会终止该语句。没有它,它将不是一个字符串,而是两个单独的行中的字符串。