29

如果我在双引号和单引号字符串的开头添加反斜杠+空格,我会得到不同的结果:

"\ text"
'\ text' 

在双引号字符串的输出中,我只看到一个空格。
在单引号字符串的输出中,我看到了反斜杠+空格。

那里发生了什么?这是因为'\ '在双引号字符串中被解释为特殊字符,但在单引号字符串中,字符按原样保留?

如果我将字符串更改为此,我会看到相同的输出,即一个斜杠后跟一个空格,然后是文本:

"\\ text"
'\\ text' 

在这两种情况下,反斜杠都会被转义。我很困惑为什么他们在这种情况下以同样的方式工作。

是否有一些规则可以帮助解释单引号字符串和双引号字符串如何在 Ruby 中处理反斜杠之间的根本区别?

4

6 回答 6

23

双引号字符串支持全范围的转义序列,如下所示:

  • \a响铃/警报 (0x07)
  • \b退格 (0x08)
  • \e转义 (0x1b)
  • \f福尔福 (0x0c)
  • \n换行符 (0x0a)
  • \r返回 (0x0d)
  • \s空间 (0x20)
  • \t选项卡 (0x09)
  • \v垂直制表符 (0x0b)

对于单引号字符串,将两个连续的反斜杠替换为单个反斜杠,反斜杠后跟单引号变成单引号:

'escape using "\\"' -> escape using "\"
'That\'s right'     -> That's right
于 2009-03-15T18:10:21.880 回答
10

Ruby 只解释双引号字符串中的转义序列。在单引号字符串中,只有\\(backslash backslash) 和\'(backslash quote) 被视为特殊字符。只有在需要更多解释时才应该使用双引号字符串。否则,单引号会提高性能。

当您提到包含变量的名称时,Ruby 从不这样做。只是变量名被视为更多的字符串文字。要包含变量(或任何表达式)的值,请将表达式放入如下:

"#{variable}"

请注意,这仅适用于双引号字符串。要将变量添加到单引号中,您需要执行以下操作:

'The value of X is: '+X

如果您需要严格的格式化,请查看 Ruby 的 sprintf 和 printf 版本。它们几乎是 C 函数的包装器,功能强大,但使用起来有点麻烦。

于 2011-11-26T15:21:01.097 回答
8

我建议您参阅“ Ruby Programming/Strings ”,以获得对差异的非常简洁而全面的概述。

从参考:

puts "Betty's pie shop"

puts 'Betty\'s pie shop'

因为 "Betty's" 包含一个撇号,它与单引号的字符相同,所以在第二行中我们需要使用反斜杠来转义撇号,以便 Ruby 理解撇号在字符串文字中,而不是标记结束字符串文字。后跟单引号的反斜杠称为转义序列。

于 2009-03-15T17:29:38.403 回答
4

这不是一个完整的答案(因为已经回答了简单的问题),而是补充信息。

你喜欢哪种风格的 Ruby 字符串引用?

如果必须转义,请不要使用双引号。并且不要陷入“单引号对双引号”的陷阱。Ruby 对字符串文字的任意分隔符有很好的支持:

http://rors.org/2008/10/26/dont-escape-in​​-strings

我接受了这个建议,再也没有回头!

于 2009-03-16T11:52:13.510 回答
3

这是因为 '\ ' 被解释为双引号字符串中的特殊字符,但在单引号字符串中,字符按原样保留?

是的。单引号字符串被视为文字;双引号字符串被插值。这在其他类似 Ruby 的语言中是相同的,并且在 1.9 中没有改变。

于 2009-03-15T18:00:17.503 回答
0

你(们)能做到<%= f.label :nom_entreprise, "Nom de l'entreprise" %>

于 2018-10-04T00:10:35.590 回答