環境
Ruby 2.6
はじめに
文字列を囲む時、ダブルクォーテーションで囲む場合と、シングルコーテーションで囲む場合とがあります。基本的な使い方をする分には、どっちを使ってもいいし、どっちを使っても同じです。個人的には、ダブルクォーテーションをひいきしてよく使っています。しかし、時々ありがちなことがあります。ネット上からサンプルコードをコピペして引用したときのことです。サンプルコードにシングルコーテーションが使われていて、気にせずに、そのまま利用し続けるようなことがあります。なぜ、ダブルクォーテーションに置換しなかったのかと言えば、特に理由はありません。本当になんとなくだけです。しかし、シングルコーテーションを残しておいたことで、あるとき、思わぬところで、変な挙動を見かけてしまうことがあります。「あれ? メッセージ名に変数が含まれている。」
そこで、ダブルクォーテーションとシングルコーテーションの違いについて、今一度、再確認しておきましょう。
その1
単に、文字列だけを扱う場合であれば、ダブルクォーテーションでも、シングルコーテーションでも、どっちを使っても同じです。
str1 = "次の停車駅は、米原です"
str2 = '次の停車駅は、米原です'
puts str1
puts str2
出力結果。
次の停車駅は、米原です
次の停車駅は、米原です
その2
文字列の中に変数が含まれる場合、ダブルクォーテーションとシングルコーテーションとでは、挙動が変わってきます。文字列の中に変数が含まれる場合は、必ず、ダブルクォーテーションで囲む必要があります。シングルコーテーションで囲むと、変数がそのまま文字列として認識されてしまいます。
station = "米原"
str1 = "次の停車駅は、#{station}です"
str2 = '次の停車駅は、#{station}です'
puts str1
puts str2
出力結果。
次の停車駅は、米原です
次の停車駅は、#{station}です
文字列の中に変数を含める場合、下記のように、文字列と変数を分離させて+で繋げると、ダブルクォーテーションを使っても、シングルコーテーションを使っても同じ結果になります。他言語からRubyに移った人は、Ruby特有の#{変数}という書き方が、最初はなんとなく、気持ち悪いといった印象を持つかも分かりません。だが、慣れてくると、逆に#{変数}の書き方の方が、スマートな気がしてくるものです。慣れというのは不思議なものです。
station = "米原"
str1 = "次の停車駅は、" + station + "です"
str2 = '次の停車駅は、' + station + 'です'
puts str1
puts str2
出力結果。
次の停車駅は、米原です
次の停車駅は、米原です
その3
文字列の中に、変数だけでなく改行コードが含まれている場合でも、シングルコーテーションは使えません。シングルコーテーションを使うと、改行コードも文字列として認識してしまいます。あえて意図的に、文字列として認識させたい場合は、シングルコーテーションを使えばいいでしょう。しかし、そのようなケースが訪れることは、自身の経験上、あまりないような気がします。
str1 = "次の停車駅は、米原です \n"
str2 = '次の停車駅は、米原です \n'
puts str1
puts str2
出力結果。
次の停車駅は、米原です
次の停車駅は、米原です \n
その4
ダブルクォーテーションの中にシングルコーテーションを記述することはできます。逆に、シングルコーテーションの中にダブルクォーテーションを記述することもできます。しかし、このような書き方をすれば、後からコードを見直した時に、一瞬「おや?」と思ってしまうことになりかねません。このような書き方をするケースも、恐らくそうそうないかとは思います。
str1 = "'次の停車駅は、米原です'"
str2 = '"次の停車駅は、米原です"'
puts str1
puts str2
出力結果。
'次の停車駅は、米原です'
"次の停車駅は、米原です"
その5
ダブルクォーテーションの中にダブルクォーテーションを書く場合、また、シングルコーテーションの中にシングルコーテーションを書く場合は、エスケープする必要があります。
str1 = "\"次の停車駅は、米原です\""
str2 = '\'次の停車駅は、米原です\''
puts str1
puts str2
出力結果。
"次の停車駅は、米原です"
'次の停車駅は、米原です'
データベースに、nilではなく、空白文字列(""または'')を更新する場合は、このような書き方をすることはよくあります。
"\"\""
'\'\''