双引号和单引号的区别

219

在IT技术中,使用""''的时间有所不同吗?

我一般都使用单引号因为打起来更方便,但是我不确定是否应该这样做。

例如:get 'user/new'get "user/new"


12
您确定这是一道关于RoR的问题,而不仅仅是一道Ruby问题吗? - Ignacio Vazquez-Abrams
有关如何选择不需要字符串插值的相关样式指南吗? - William Entriken
7个回答

236

" "允许您进行字符串插值,例如:

world_type = 'Mars'
"Hello #{world_type}"

2
所以基本上,一直使用双引号就可以了,是吗? - nekonari
12
不使用双引号会禁用字符串插值,而双引号只是允许字符串插值的一种方式。如果您不想使用字符串插值,则不应该使用双引号。 - Panh
19
只有在需要插值时才使用双引号并没有什么理由,它不会对性能产生显著影响,只会让你思考该用哪种引号。直接使用双引号字符串即可。 - sidney
@sidney,我喜欢这样想:“无论何时都使用单引号,当你必须使用双引号时你就会知道”。 - Jeremie Ges
主观地说,我认为单引号让代码看起来更清晰、不那么繁忙,稍微容易阅读一些。 - undefined

161

除了插值之外,另一个区别是在单引号中无法使用“转义序列”

puts 'a\nb' # just print a\nb 
puts "a\nb" # print a, then b at newline 

47
除了转义单引号本身外,例如'don\'t' - Sparhawk
4
这是对这个问题非常有用的答案。我从未意识到单引号用于字面上打印单引号之间的所有内容,除了必须转义的引号。谢谢你。 - Jay Godse
7
反斜线也可以尝试使用 puts '\\'。它只会打印一个反斜线。在这里查看:http://stackoverflow.com/questions/25499046/is-it-possible-to-escape-character-within-single-quotes-in-ruby/25499079 - Hardik
2
是的,这是你只能用单引号转义的两种情况。 - Alexis
@Alexis 不确定,可能在性能方面有一些差异。 - lfx_cool
显示剩余2条评论

54

在Ruby中,单引号''和双引号""之间存在差异,涉及到哪些内容能够被评估为一个字符串。

首先,我想澄清一下,在字符串的文字形式中,不管是单引号还是双引号之间的任何内容都会被评估为字符串对象,这是Ruby String类的一个实例。

因此,'stackoverflow'"stackoverflow"都将被评估为String类的实例,没有任何区别

区别

两种字符串文字形式(单引号或双引号)的本质区别在于双引号允许转义序列,而单引号则不行!

使用单引号创建的字符串文字形式不支持字符串内插转义序列

一个简洁的例子是:

"\n" # will be interpreted as a new line

相反

'\n' # will display the actual escape sequence to the user

使用单引号进行插值完全不起作用:

'#{Time.now}'
=> "\#{Time.now}" # which is not what you want..

最佳实践

正如大多数Ruby Linters建议的那样,在字符串中使用单引号字面量,并在插值/转义序列的情况下使用双引号。


1
如果你有一个变量 a = '\n' 和 b = "#{a}",那么 b 会被解释为换行符还是转义序列呢? - NathanTempelman
5
当你将 a = '\n' 赋值后,如果将 a 插入到 b 中进行解析,你得到的将是 "\n" 而不是一个新行符。b 将会被解析为 "\n" (因为转义字符)。当 a = '\n' 时,a 将变成 "\n";而当 a = "\n" 时,a 将是一个新行符 "\n"。 - aloucas
没有必要仅在需要插值时使用双引号,它不会有显著的性能影响,只会让你考虑使用什么。直接使用双引号字符串即可。尽管你可能将其称为最佳做法,但这是无意义的。 - sidney
@aloucas 谢谢你的解释!我希望在 Ruby 文档中有一个地方描述了这种意外行为。我之所以问这个问题,是因为我花了一整天来调试一个由于使用单引号而导致的“哈希”问题。 - AndyPandy_25Flow

43

回答您的问题,当您想要进行字符串插值时,必须使用""

a = 2
puts "#{a}"

最好使用单引号。

如果你想知道在性能方面是否有区别,可以在StackOverflow上查看这个问题的优秀讨论。

如果你还不熟悉RoR,我建议你选择一本不错的Ruby书籍来学习语言基础。它将帮助你理解你所做的事情(并且会让你不再认为Rails是魔法)。我个人推荐《Ruby基础教程》


6
与打印时的答案 "\n" 相似,下面是另一个区别的例子。
puts "\1"  -> get special character
puts '\1'  -> get \1

看起来星号在双引号中被转换为转义字符,但在单引号中不会。 顺便提一下,这会影响在正则表达式中使用它的输出 例如, str.gsub(/正则表达式/, '\1,\2')


5

当将 regex 模式作为字符串传递时,您需要使用单引号的另一个原因是:

这个 regex 模式将会生效,因为它被包含在单引号中:

"123 ABC".match('\d')
=> #<MatchData "1">

这个正则表达式模式会失败,因为它被放在双引号中(您必须进行双重转义才能使其起作用):

"123 ABC".match("\d")
=> nil

-10
在这种情况下,你如何编写代码都没有任何区别。它们是等效的。此外,你可能想要阅读一些更多的 Ruby 指南和教程 :)

6
双引号允许字符串解析,因此它们与单引号不等同。 - Jason Noble
9
你在做那个极其聪明的观察之前,有没有阅读“在这种特定情况下”的部分? - Geo
12
好的,他的问题是何时使用单引号和双引号。 - Jason Noble

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接