我在拉取请求中查看了一行Ruby代码。我不确定这是否是我之前未见过的错误或功能:
puts "A string of Ruby that"\
"continues on the next line"
反斜杠是连接这些字符串的有效字符吗?或者这是一个错误吗?
答案 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"] ....
换行符前面的反斜杠将取消换行符,因此它不会终止该语句;没有它,它不会是一个字符串,而是两个单独的行中的字符串。