单引号字符串中的反斜杠与单引号字符串中的反斜杠双引号字符串
题
如果我在双引号和单引号字符串的开头添加反斜杠+空格,则会得到不同的结果:
"\ 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的语言相同,以及在1.9没有变化。
您可以<%= f.label :nom_entreprise, "Nom de l'entreprise" %>