双引号与单引号


171

我真的很新的Ruby,我想了解,如果有,当我应该使用一个特定的时间""VS ''

我大多数时候都在使用单引号,因为它更容易键入,但是我不确定是否应该这样做。

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


12
您确定这是RoR问题,而不仅仅是Ruby问题吗?
伊格纳西奥·巴斯克斯

是否有有关选择何时不需要字符串插值的样式指南?
威廉·恩崔肯

Answers:


202

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

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

1
因此,基本上,一直都使用双引号对吧?
nekonari

8
不-双引号仅允许字符串插值。如果您不希望字符串插值,则不应使用双引号。
Panh

4
没有理由仅在需要插值时才使用双引号,不会对性能产生重大影响,只会使您认为必须使用什么。只需使用双引号引起来的字符串即可。
Matheus

137

除插值外,另一个区别是“转义序列”不适用于单引号

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

42
除了转义单引号本身外,例如'don\'t'
Sparhawk

3
这是对这个问题的非常有用的答案。我从未意识到单引号实际上是打印单引号之间的所有内容,但必须转义的引号除外。谢谢。
杰伊·戈德斯

6
并且反斜杠也可以尝试puts '\\'它只会打印单个斜杠。看到这里stackoverflow.com/questions/25499046/…–
Hardik

是的,确实是仅有的两种可以用单引号引起来的情况
Alexis

@Alexis不确定,也许在性能上有些差异
lfx_cool

40

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

a = 2
puts "#{a}"

否则,请使用简单的引号。

另外,如果您想了解性能是否存在差异,那么在StackOverflow上还有一个很好的问题。

而且,如果您真的是RoR的新手,我敦促您拿起一本不错的Ruby书来学习该语言的基础知识。它将帮助您了解自己在做什么(并使您避免认为Rails是魔术)。我个人推荐The Well扎根的Rubyist


34

在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..

最佳实践

由于大部分红宝石棉短绒的建议使用单引号的文字为你的字符串,并走在插/转义序列的情况下,双重的。


1
因此,如果您有一个='\ n'和b =“#{a}”,b会被解释为换行还是转义序列?
NathanTempelman '16

4
分配a ='\ n'的那一刻,通过将a插值到b被解释为“ \\ n”,您将不会获得新的一行。b将评估为“ \\ n”(没有新行,您将获得转义序列)。a ='\ n'=>“ \\ n”其中,a =“ \ n” =>“ \ n”
aloucas

6

单引号的字符串不处理ASCII转义码(\ n,\ t等),并且双引号不对字符串进行内插,而双引号则同时进行。

转义代码示例:

2.4.0 :004 >   puts 'Hello \n World'
Hello \n World

2.4.0 :005 > puts "Hello \n World"
Hello
World

插值示例:

2.4.0 :008 >   age=27
 => 27

2.4.0 :009 > puts 'Age: #{age}'
Age: #{age}

2.4.0 :009 > puts "Age: #{age}"
Age: 27

4

与打印中的答案“ \ n”类似,以下是另一种区别

puts "\1"  -> get special character
puts '\1'  -> get \1

所以看起来*已转换为双引号而不是单引号的转义字符。顺便说一句,在正则表达式中使用时会影响输出,例如str.gsub(/ regular expression /,'\ 1,\ 2')


2

您希望使用单引号的另一个原因是在将正则表达式模式作为字符串传递时:

此正则表达式模式将起作用,因为在单引号内进行了传递:

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

此正则表达式模式将失败,因为在双引号内进行了传递(您必须对其进行两次转义才能使其正常工作):

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

-8

在这种情况下,编写方式没有任何区别。它们是等效的。另外,您可能想阅读更多的Ruby指南/教程:)


4
它们不等效,因为双引号允许字符串解释。
杰森·诺布尔

7
在进行极其巧妙的观察之前,您是否阅读过“在这种情况下”部分?
地理

9
是的,但是他的问题是何时使用单引号还是双引号。
杰森·诺布尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.