如果我在双引号和单引号字符串的开头添加反斜杠+空格,我会得到不同的结果:
"\ text" '\ text'
在双引号字符串的输出中,我只看到一个空格.
在单引号字符串的输出中,我看到反斜杠+空格.
那里发生了什么?这是因为'\ '
在双引号字符串中被解释为一个特殊字符,但在单引号字符串中,字符是按原样保留的吗?
如果我将字符串更改为此,我会看到相同的输出,即单个斜杠后跟一个空格,然后是文本:
"\\ text" '\\ text'
在这两种情况下,反斜杠都会被转义.我很困惑为什么他们在这种情况下以同样的方式工作.
是否有一些规则可以帮助解释单引号字符串和双引号字符串如何处理Ruby中的反斜杠之间的根本区别?
双引号字符串支持所有转义序列,如下所示:
\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
Ruby只解释双引号字符串中的转义序列.在单引号字符串中,仅将\\
(反斜杠反斜杠)和\'
(反斜杠引用)视为特殊字符.只有在需要更多解释时才应使用双引号字符串.否则,单引号可提高性能.
当你提到包含变量的名称时,Ruby永远不会这样做.只是变量名称被视为更多的字符串文字.要包含变量(或任何表达式)的值,请将表达式放入:
"#{variable}"
请注意,这仅适用于双引号字符串.要将变量添加到单引号变量,您需要执行以下操作:
'The value of X is: '+X
如果您需要认真的格式化,请查看Ruby的sprintf和printf版本.它们几乎是围绕C函数的包装器,并且非常强大,但使用起来有点麻烦.
我将向您推荐" Ruby Programming/Strings ",以便对这些差异进行非常简洁而全面的概述.
来自参考:
puts "Betty's pie shop"
puts 'Betty\'s pie shop'
因为"Betty's"包含一个撇号,它与单引号的字符相同,所以在第二行中我们需要使用反斜杠来转义撇号,以便Ruby理解撇号是字符串文字而不是标记结尾字符串文字.单引号后面的反斜杠称为转义序列.