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

Posted

技术标签:

【中文标题】单引号字符串与双引号字符串中的反斜杠【英文标题】:Backslashes in single quoted strings vs. double quoted strings 【发布时间】:2010-10-13 11:40:03 【问题描述】:

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

"\ text"
'\ text' 

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

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

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

"\\ text"
'\\ text' 

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

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

【问题讨论】:

在您编辑之后,您的问题现在基本上是“目前 Ruby 1.9 的 Wikibooks 是否是最新的”。请编辑问题标题以匹配此问题。 【参考方案1】:

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

\a 响铃/警报 (0x07) \b退格(0x08) \e Escape (0x1b) \fFormford (0x0c) \n换行(0x0a) \r 返回 (0x0d) \s 空格 (0x20) \t 制表符 (0x09) \v 垂直制表符 (0x0b)

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

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

【讨论】:

双引号或单引号字符串中的单个反斜杠本身有什么用处?我只是感到困惑,因为它似乎什么也没做,只是消失了【参考方案2】:

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

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

"#variable"

请注意,这仅适用于双引号字符串。要将变量添加到单引号中,您需要这样做:

'The value of X is: '+X

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

【讨论】:

不要相信有关性能提升的部分。它不会出现在基准测试中,因为 Ruby 在加载文件时会解析字符串并且差异消失了。我们在其中一个问题的某处对 SO 进行了基准测试,结果揭穿了这个想法。 如果有提升,它很小,只会在应用启动期间发生。 @theTinMan:你认为你能找到我的基准吗?我想看看它。从理论上讲,不必寻找转义序列应该会提高性能,但这只是一点点优化的 C 语言,很难注意到差异。 有问题的benchmark 是关于定义数组的各种方法。我认为字符串也存在相同的情况,即在加载脚本时删除了差异,并且一旦在内存中就没有真正的区别。根据该答案中的基准,编写测试以供您自己查看是很容易的。 @theTinMan:我不认为这是有效的。数组都定义了完全相同的东西。当您使用 " 引号与 ' 引号时,解释器实际上必须做一些额外的和不同的事情。这不仅仅是另一种语法。 您可能想查看***.com/questions/1836467/…【参考方案3】:

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

来自参考:

puts "Betty's pie shop"

puts 'Betty\'s pie shop'

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

【讨论】:

来自"How do I write a good answer?":“鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用最相关的部分重要链接,以防目标站点无法访问或永久离线。”【参考方案4】:

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

Which style of Ruby string quoting do you favour?

如果必须,不要使用双引号 逃离他们。不要陷入“单身” vs 双引号”陷阱。Ruby 有 对任意性的出色支持 字符串文字的分隔符:

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

有没有办法将双引号字符串(内插)转换为单引号? 如果没有我会很惊讶!【参考方案6】:

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

【讨论】:

以上是关于单引号字符串与双引号字符串中的反斜杠的主要内容,如果未能解决你的问题,请参考以下文章

Python3基础 print 用反斜杠输出单引号与双引号

Perl中的反斜杠单引号

Python中的单引号与双引号[关闭]

sql注入逃逸双引号转义

(实用篇)PHP中单引号与双引号的区别分析

PHP教程:PHP中单引号与双引号的区别分析