仕事では Rails のプロジェクトに関わっていて、最近は RuboCop の導入と RuboCop による指摘箇所の修正を主に進めています。
最近の修正では、「文字列を囲むクオーテーションを統一する」に着手をして、今回の Rails プロジェクトでは「シングルクォート」に統一をしました。(正確には「基本はシングルクォートを使い、式展開や文字列内にシングルクォートがある場合はダブルクォートを使う」です。)
ただ、どちらを採用するのが良いのか、すごく悩みましたし、今でも本当にシングルクォートが良かったのか、悩んでいます。
多分、答えはないのですが、悩んだ過程やそのときに調べたことをブログ記事にまとめておきたいと思います。
RuboCop とは
RuboCop はコーディングスタイルをチェックする Ruby 向けの静的解析ツールです。
例えばインデントがズレていたり、今回の記事のようにシングルクォートとダブルクォートが混在していたり、その他たくさんのルールに対して Ruby のコードがコーディングスタイルに沿っているか、チェックしてくれます。
bbatsov/rubocop: A Ruby static code analyzer, based on the community Ruby style guide.
RuboCop のバージョン
この記事を書いているときの仕事の Rails プロジェクトで採用している RuboCop のバージョンは「0.49.0」です。
ちなみに、記事執筆時点の最新バージョンは「0.49.1」です。
RuboCop の初期値は「シングルクォート」
RuboCop の初期値は「シングルクォート」です。
Style/StringLiterals:
EnforcedStyle: single_quotes
SupportedStyles:
- single_quotes
- double_quotes
# If `true`, strings which span multiple lines using `\` for continuation must
# use the same type of quotes on each line.
ConsistentQuotesInMultiline: false
https://github.com/bbatsov/rubocop/blob/master/config/default.yml#L1162
Rails の RuboCop の設定は「ダブルクォート」
これが一番、悩む原因なのですが、 Rails の RuboCop は「ダブルクォート」になっています。
# Check quotes usage according to lint rule below.
Style/StringLiterals:
Enabled: true
EnforcedStyle: double_quotes
https://github.com/rails/rails/blob/master/.rubocop.yml#L95
速度の問題
PHP だとシングルクォートの方が速い、という話を聞いたことがあるのですが、今はどうなんでしょうか。(右記は 2003 年の記事だけど、速度的にはほとんど変わらないらしい。 PHP のバージョンが書いてないのが気になるけど。 → php のシングルクォートはほんとうに早いのか – それマグで!)
調べてみたら、 Ruby の場合は速度的にはほとんど変わらないらしいです。
参考
RuboCop のドキュメントにはどちらでも良いと書いてある
RuboCop のドキュメントには「どちらでも良いのでどちらかに統一しましょう」と書いてあります。
英語のドキュメント
Adopt a consistent string literal quoting style. There are two popular styles in the Ruby community, both of which are considered good—single quotes by default (Option A) and double quotes by default (Option B).
https://github.com/bbatsov/ruby-style-guide#consistent-string-literals
日本語のドキュメント
文字列リテラルの引用符は一貫したスタイルで使いましょう。 Rubyコミュニティでは、 デフォルトでシングルクォートを用いるもの (Option A)、 ダブルクォートを用いるもの (Option B) の二つのよく使われるスタイルがあって、 どちらも良いと考えられています。
他社(他者)はどちらを採用しているか
じゃあ他の会社や他のプロダクトはどうしているのかってことで、主に Google 検索と私の知っている Rails プロダクトの状況を調べてみました。
「うちはこうしているよ」とか「このプロダクトも調べて欲しい」などありましたら、コメントいただければ思います。
他社
永和システムマネジメント
- シングルクォート(記載がないので、 RuboCop の初期設定に従っているものと思われる)
- https://github.com/esminc/deka_eiwakun/blob/master/config/rubocop.yml
- http://agile.esm.co.jp/news/2016-04-01-open-esm-ruby-code-convention.html
Misoca
Forkwell
- シングルクォート(記載がないので、 RuboCop の初期設定に従っているものと思われる)
- https://github.com/grooves/forkwell_cop
- http://tech.grooves.com/entry/2016/09/29/101539
スパイスライフ
- 無効(どちらを使っても良い)
- https://github.com/spice-life/lint/blob/master/config/rubocop.yml#L41
- http://blog.spicelife.jp/entry/2017/02/24/113544
ドリコム(の中の人)
- ダブルクォート
- https://github.com/onk/onkcop/blob/master/config/rubocop.yml#L202
- http://blog.onk.ninja/2015/10/27/rubocop-getting-started
プロダクト
Rails
Redmine
- RuboCop 無し(少しコードを読んで見たら、シングルクォートとダブルクォートの両方がありました)
- https://github.com/redmine/redmine
Mastodon
- シングルクォート(記載がないので、 RuboCop の初期設定に従っているものと思われる)
- https://github.com/tootsuite/mastodon/blob/master/.rubocop.yml
Joruri
- シングルクォート(記載がないので、 RuboCop の初期設定に従っているものと思われる)
- https://github.com/joruri/joruri-cms/blob/master/.rubocop.yml
- http://joruri.org
Errbit
- 無効化( todo にて設定)
- https://github.com/errbit/errbit/blob/master/.rubocop_todo.yml#L81
- https://errbit.com
合計
- シングルクォート: 5
- ダブルクォート: 2
- どちらでもOK: 2
- RuboCop 無し: 1
まとめ
以上、Ruby で文字列をシングルクォートで囲むかダブルクォートで囲むか、どちらを選択したらいいか悩ましい話でした。
上記の「合計」を見ると、シングルクォートでいいのかなと思いました。 RuboCop の初期値でもありますし。