Double vs single quotes
Asked Answered
L

7

220

Is there a specific time when I should use "" vs ''?

I've been using single quotes most of the time because it's easier to type but I'm not sure if I should.

e.g. get 'user/new' vs. get "user/new"

Lactone answered 18/6, 2011 at 10:12 Comment(2)
Are you sure that this is a RoR question, and not just a Ruby question?Lacedaemon
Is there a relevant style guide on choosing when string interpolation is not needed?Vitiate
P
237

" " allows you to do string interpolation, e.g.:

world_type = 'Mars'
"Hello #{world_type}"
Purveyor answered 18/6, 2011 at 10:22 Comment(5)
So basically, just use double quotes all the time, right?Licence
No - double quotes simply allow for string interpolation. If you do not want string interpolation, then you should not use double quotes.Slant
There is no reason to use double quotes only when you need interpolation, there is no significant performance impact and it will just make you think what you have to use. Just use double-quoted strings.Viewer
@sidney I like to think about it as: "Use single quotes everywhere, you'll know when you have to use the double form".Patience
Subjectively, I think single quotes make code look cleaner, less busy and slightly easier to read.Coiffeur
M
162

except the interpolation, another difference is that 'escape sequence' does not work in single quote

puts 'a\nb' # just print a\nb 
puts "a\nb" # print a, then b at newline 
Mundell answered 17/5, 2013 at 4:38 Comment(7)
Except for escaping single quotes themselves, e.g 'don\'t'.Mcknight
This is a very useful answer to this qvestion. I never realized that single-quoting was for printing literally everything between the single quotes, with the exception of quotes which must be escaped. Thank you.Tuberculate
And backslash also try puts '\\' It will only print single slash. see here #25499546Remde
yup, does are the only two cases you can escape with single quotesBeslobber
@Beslobber not sure, maybe a little difference on the performanceMundell
i was pointing that there aren't more cases for escaping characters(\' and `\`), not that there aren't more differences between single and double quotes, in any case the performance difference is truly insignificant https://mcmap.net/q/120624/-is-there-a-performance-gain-in-using-single-quotes-vs-double-quotes-in-rubyBeslobber
Got burned when trying to gsub all newlines, never do this: str.gsub('\n', '<br>') , do this: str.gsub("\n", '<br>')Duckett
C
54

There is a difference between single '' and double quotes "" in Ruby in terms of what gets to be evaluated to a string.

Initially, I would like to clarify that in the literal form of a string whatever is between single or double quotes gets evaluated as a string object, which is an instance of the Ruby String class.

Therefore, 'stackoverflow' and "stackoverflow" both will evaluate instances of String class with no difference at all.

The difference

The essential difference between the two literal forms of strings (single or double quotes) is that double quotes allow for escape sequences while single quotes do not!

A string literal created by single quotes does not support string interpollation and does not escape sequences.

A neat example is:

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

whereas

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

Interpolating with single quotes does not work at all:

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

Best practice

As most of the Ruby Linters suggest use single quote literals for your strings and go for the double ones in the case of interpolation/escaping sequences.

Calibrate answered 21/2, 2016 at 22:43 Comment(4)
So if you had a = '\n' and b = "#{a}", would b be interpreted as a new line or as the escape sequence?Fraya
The moment you assign a = '\n' a gets interpreted as "\\n" by interpollating a to b you wont get a new line. b will evalutate to "\\n" (no new line you get the escape sequence). a = '\n' => "\\n" where as a = "\n" => "\n"Calibrate
There is no reason to use double quotes only when you need interpolation, there is no significant performance impact, and it will just make you think about what you have to use. Just use double-quoted strings. Although you may call it best practice, it's nonsense.Viewer
@Calibrate Thanks for this explanation! I wish there was somewhere this unexpected behaviour is described in the Ruby documentation. I ask this because I've spent the whole day debugging a "hashing" issue that was caused by using single rather than double quotes.Uncaredfor
W
43

To answer your question, you have to use "" when you want to do string interpolation:

a = 2
puts "#{a}"

Use simple quotes otherwise.

Also if you are wondering about whether there is a difference in terms of performance, there is an excellent question about this on StackOverflow.

And if you are really new to RoR, I urge you to pick up a decent Ruby book to learn the basics of the language. It will help you understand what you are doing (and will keep you from thinking that Rails is magic). I personally recommend The Well grounded Rubyist.

Woodrum answered 18/6, 2011 at 10:21 Comment(0)
T
6

Similar to the answer "\n" in printing, following is another case of the difference

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

so looks like * was convert to escaped character in double quotes, but not in single quotes. BTW, it will impact the output when using in regular expression e.g., str.gsub(/regular expression/, '\1,\2')

Tenpin answered 30/10, 2013 at 1:35 Comment(0)
F
5

Another reason you would want to use single-quotes is when passing a regex pattern as a string:

This regex pattern will work because passed within single-quotes:

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

This regex pattern will fail because passed within double-quotes (you would have to double-escape it to get it to work):

"123 ABC".match("\d")
=> nil
Faddist answered 7/11, 2019 at 20:39 Comment(0)
B
-10

In this specific case, it makes no difference how you write it. They are equivalent. Also, you may want to read some more Ruby guides/tutorials :)

Bawdy answered 18/6, 2011 at 10:23 Comment(3)
They are not equivalent, as double quotes allows for string interpretation.Predictory
Did you read the "In this specific case" part, before making that extremely clever observation?Bawdy
Yes, but his question was when to use single vs. double quotes.Predictory

© 2022 - 2024 — McMap. All rights reserved.