单引号字符串与双引号字符串中的反斜杠

时间:2009-03-15 17:08:00

标签: ruby string quotes literals backslash

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

"\ text"
'\ text' 

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

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

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

"\\ text"
'\\ text' 

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

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

6 个答案:

答案 0 :(得分:20)

双引号字符串支持所有转义序列,如下所示:

  • \a响铃/警报(0x07)
  • \b退格(0x08)
  • \e逃脱(0x1b)
  • \f Formford(0x0c)
  • \n换行符(0x0a)
  • \r返回(0x0d)
  • \s空格(0x20)
  • \t标签(0x09)
  • \v垂直标签(0x0b)

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

'escape using "\\"' -> escape using "\"
'That\'s right'     -> That's right

答案 1 :(得分:9)

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

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

"#{variable}"

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

'The value of X is: '+X

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

答案 2 :(得分:7)

我会将您推荐给“Ruby Programming/Strings”,以便对这些差异进行非常简洁而全面的概述。

参考文献:

  

puts "Betty's pie shop"

     

puts 'Betty\'s pie shop'

     

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

答案 3 :(得分:4)

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

Which style of Ruby string quoting do you favour?

  

如果必须,请勿使用双引号   逃避他们。并且不要陷入“单身   vs双引号“陷阱.Ruby有   对任意的极好支持   字符串文字的分隔符:

     

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

我接受了这个建议,从未回头过去!

答案 4 :(得分:3)

  

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

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

答案 5 :(得分:0)

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