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

"\ text"
'\ text' 

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

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

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

"\\ text"
'\\ text' 

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

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

有帮助吗?

解决方案

我想请您看看 “ Ruby编程/字符串” 为的差别非常简明而全面概述。

从参考:

  

puts "Betty's pie shop"

     

puts 'Betty\'s pie shop'

     

由于“Betty的”包含撇号,这是相同的字符作为单引号,在第二行,我们需要使用反斜杠逃脱撇号以便红宝石理解撇号是字符串文字中,而不是标记的字符串文字的结尾。反斜杠后跟单引号被称为转义序列。

其他提示

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

  • \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

红宝石仅解释逃避双引号字符串序列。在一个单引号字符,只有\\(反斜杠反斜杠)和\'(反斜杠报价)被当作特殊字符。当你需要更多的解释,才应使用双引号的字符串。否则,单引号提供的性能提升。

当你提到包括变量的名称,红宝石从未做到这一点。就在变量名被视为更字符串文字的。以包括变量的值(或任何表达式)把在像这样的表达式:

"#{variable}"

请注意,这只是工作在双引号中的字符串。要将变量添加到一个单引号的,你需要做的:

'The value of X is: '+X

如果您需要认真格式,看看Ruby的版本sprintf和printf函数。他们周围的C函数几乎包装,并且是相当强大的,但有点麻烦使用。

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

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

如果您必须逃脱,请不要使用双引号。而且不要落入“单与双引号”陷阱中。Ruby对弦线文字的任意分界符有很好的支持:

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

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

  

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

是。单引号字符串被视为文字;双引号字符串插值。这是在其它类Ruby的语言相同,以及在1.9没有变化。

您可以<%= f.label :nom_entreprise, "Nom de l'entreprise" %>

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top