Double vs single quotes

2019-01-01 08:26发布

问题:

I\'m really new to Ruby and I\'m trying to understand if there\'s 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\"

回答1:

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

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


回答2:

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 


回答3:

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.



回答4:

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.



回答5:

A single-quoted strings don’t process ASCII escape codes( \\n, \\t etc), and they don’t do string interpolation while double-quoted does both.

Escape code example:

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

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

Interpolation example:

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


回答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\')



回答7:

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 :)