文字列リテラルを表すのにシングルクォートとダブルクォートどっちを使うか問題、私見
プログラミングにおいて、文字列リテラルを表すときにシングルクォートを使ったり、ダブルクォートを使ったりするが、両者をどう使い分けるかについての私見をまとめる。
シングル・ダブルで機能が異なる場合 (Bash・Perl・PHP など)
Bash をはじめとするいくつかの言語では、
- シングルクォートで囲んだ場合は変数が展開されない
- ダブルクォートで囲んだ場合は変数が展開される
という機能差が存在する。
こうした機能差が存在する言語においては、自分は変数展開したい場合を除いてシングルクォートを使うことにしている。変数展開させたい場所だけダブルクォートを使うワケだ。
# ただの文字列で変数展開しているのでシングルクォート
$ my_variable='Hello World'
# 変数展開しているのでココだけダブルクォートを使う
$ second_variable="Welcome to ${my_variable} !!"
# curl する時とか
$ curl -X POST \
-u "${my_username}:${my_password}" \
-H 'Content-Type: application/json' \
"https://example.com/${api_name}/"
こんな感じ。
一律でダブルクォートを使う人もいるが、うっかり変数展開される事故を防ぐために、自分はシングルクォートを使うようにしている。
変数展開しない文字列の中に、文字としてシングルクォートを書きたい場合は、エスケープして書く。エスケープを面倒臭がってダブルクォートを使うことはしない。
シングル・ダブルで機能が変わらない場合 (JavaScript・Python など)
JavaScript や Python では、シングルクォートを使ってもダブルクォートを使っても、変数展開などの機能差がない。こういう言語では、シングルクォートのみを使うことにしている。
以前、JavaScript についてはクォーテーション問題について記事を書いたが、この時点から比べて現在はよりシングルクォート派になっている。
シングルクォートを文字として使用したい場合は、やはりエスケープして挿入している。エスケープを面倒臭がってダブルクォートを使うことはないのだ。
シングルクォートを優先的に使うメリット
というワケで、自分はシングルクォートを優先的に使う派閥なのだが、なぜダブルクォートをなるべく使わず、シングルクォートを優先しているかというと、大きく2つの理由がある。
1. コードの見た目がダブルクォートよりスッキリする
"A"
と 'A'
とでは、後者のシングルクォートを使った方が、「点々」が少なくて見た目がスッキリする、という、見た目の問題。
2. US キーボード使用者はシングルクォートの方がタイプが楽
僕は普段、US キーボードを使っている。US キーボードの場合、
- シングルクォートは、ホームポジションの右手小指の一つ右隣のキー (
L
キーから2つ右のキー。日本語配列だと: * け
の刻印のキー位置) - ダブルクォートは、
Shift
を押しながら↑のキー
と入力する。つまり、シングルクォートは Shift
を押さず、ホームポジションからほとんど移動せずに入力できるのだ。入力が楽だから、シングルクォートを使う傾向にある、ということ。
日本語キーボードの場合は、
- シングルクォートは
Shift + 7 キー
- ダブルクォートは
Shift + 2 キー
と入力する。いずれも Shift
キーの押下が必要なので、あまり「入力が楽」という感覚が持ちづらいかと思う。
ただ、2
キーと 7
キーの位置関係から、シングルクォートを入力する際は左 Shift、ダブルクォートを入力する際は右 Shift を押下することになるだろう。ココで、右 Shift キーを使い慣れていないユーザがダブルクォートを入力しようとすると、「左小指で左 Shift を押しつつ、左中指あたりで 2
キーを入力する」という奇妙な手の形になってしまう。そう思うと、日本語配列の場合もシングルクォートを優先的に使うようにしておくと、右 Shift キーに慣れていないユーザでもあまり入力の負担がかからずに済むかと思う。
以上
US キーボードは記号キーの配列がとても理にかなっていて、日本語配列から転向してさらに入力速度が向上した。特にシングルクォートについては「Shift キーを押さなくて良くなった」唯一の記号であり、入力負荷が下がったことから、ダブルクォートよりも多用するようになった次第。
それに、プログラミング言語によって機能差がある場合は、それを明確に使い分けることで、変数展開の有無などを明示でき、リーダブルで誤解の少ないコードになると思っている。