ダブルクォーテーションとシングルクォーテーションの違いって?

f:id:ryoutaku_jo:20181231195119p:plain

【結論】

 

ダブルクォーテーション(”)で文字列を作った場合、

 ダブルクォートで囲まれた文字列では、

 バックスラッシュ記法\n)と式展開有効になる。

 

シングルクォーテーション(’)だと、文字列の中身の解釈は行われない為、

 バックスラッシュ記法式展開無効になる。

 

・文字列内の解釈が行われない分、シングルクォーテーション(’)の方が、

 理論上の処理速度は早いが、基本的に大きな差は無い。

 

・ダブルクォーテーションを使う必然性が無い場合は、

 コーティング規約に従って使い分けをする。

 

 

【本題】

 

Rubyで文字列を作る場合、一般的にはダブルクォーテーション(”)か

シングルクォーテーション(’)で囲いますよね?

 

初めは何気になく使っていたのですが、学習が進むにつれて、

ある違和感が出てきました。

 

「これ、何が違うの?」

 

 

気になってスクールのカリキュラムを見返したのですが、

文字列を生成するには、文字を"(ダブルクォテーション)

または'(シングルクォテーション)で囲みます。

としか説明されていないんですよね・・・

 

 

 

 

 

ということで、調べることにしました。

 

最近、私が学んだことは、こういう時は

「公式のリファレンスから読め!」

Googleで検索した情報より、情報の精度が高いケースが多い)

ということなので、そちらから調べてみました。

 

 

'

'abc'

文字列リテラル。最低限のエスケープだけしかしません。式展開などをしたい場合はかわりに""を用います。

 

 

"

"abc"

文字列リテラル。式展開などが可能なタイプの文字列リテラルです。 

 

 

 

文字列リテラル

 

文字列はダブルクォートまたはシングルクォートで囲まれています。

ダブルクォートで囲まれた文字列ではバックスラッシュ記法式展開が有効になります。

 

シングルクォートで囲まれた文字列では、

\\ (バックスラッシュそのもの)と \' (シングルクォート) を除いて

文字列の中身の解釈は行われません。

 https://docs.ruby-lang.org/ja/2.5.0/doc/symref.html#sq

 

 

 

 

つまり、バックスラッシュ記法式展開を使いたい時には、

絶対ダブルクォートで囲わないと駄目ということですね。

 

じゃあシングルクォートは、バックスラッシュ記法式展開を、

そのまま文字列として扱いたい時だけに使うのでしょうか?

 

 

 

 

公式で分かったのは、ここまでなので、ここからGoogleで調べていきます

 

式展開する処理が動く分、

ダブルクォーテーションの方が処理時間がかかることがわかる。

 https://qiita.com/Kenji_TAJIMA/items/78555053a36c214be350

 

 

なるほど、ダブルクォーテーションだと、

バックスラッシュ記法式展開の有無に関わらず、

文字列の中身の解釈が行われるから、処理速度が早いのか。

 

 

ダブルクオートとシングルクオートの速度差は体感できるほどではない

 https://qiita.com/cielavenir/items/3bbb4e483df8ba03de03

 

 

 

「・・・どっちだよ!?」

 

 

 

インターネットを見ても、ダブル派とシングル派で二分していて、

結局どっちが良いのか分からない・・・

 

 

 

 

なので、自分で計測してみることにした!

 

 

標準ライブラリにこんなのがあったので、試しにこれを使ってみます。

 

module Benchmark

要約

ベンチマークを取るためのモジュールです。

https://docs.ruby-lang.org/ja/latest/class/Benchmark.html

 

 

そして計測用に書いたコードがこちら。

f:id:ryoutaku_jo:20181231195119p:plain





 

 

 

いざ、計測!!

 

f:id:ryoutaku_jo:20181231194111p:plain



 

 

 

 

 

 

うん、僅差(笑)

 

 

もっと延々ループさせる様な処理などであれば、大きな違いが出るのでしょうが、

今の私の実力だと、そこまで複雑なことは出来ないので、

処理速度については、考慮しなくて良さそうですね。

 

 

最後に、私が最近購入したRuby本にも、

このテーマについて言及があったので、下記に引用します。

 

 

(前略)

式展開を使ったりする場合は、

必然的にダブルクォートを使うことになりますが、

そうでない場合(どっちも違いがない場合)は、

どちらを使えばいいのでしょうか?

これは「お好きなほうを使ってください」というのが答えになります。

(中略)

ただし、「ダブルクォートを使う必然性がない場合は

シングルクォートを使うこと」というコーティング規約を

見かけることもあります。チームで開発する場合は、

どちらでも良いのか、こだわりを持って使い分けるのか、

チームメンバー内で方針を確認していた方が良いかもしれません。

タイトル:「プロを目指す人のためのRuby入門」 ※26ページ

著者:「伊藤淳一」

 

 

 

 

最終的には、現場毎のコーティング規約に則るのが、最も良いということですね。

 

 

この「Rubyスタイルガイド」にも、使い分けに関する記載がありました。

https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md

 

 

文字列リテラルの引用符は一貫したスタイルで使いましょう。

Rubyコミュニティでは、

デフォルトでシングルクォートを用いるもの (Option A)、

ダブルクォートを用いるもの (Option B)の二つのよく使われるスタイルがあって、どちらも良いと考えられています。

 

(Option A) 文字列挿入の必要がないときや、

\t\n`’`等の特別な文字がない場合は、

シングルクォーテーションを使いましょう。

 

(Option B) 文字列中に"を含んでいたり、

エスケープ文字を抑えたいときでない限り、

ダブルクォーテーションを使いましょう。

 

 

 

以上、私は個人的には、使い分けがややこしいので、

ダブルクォートメインがやりやすいと感じました。

 

 

《今日の学習進捗》

Sassについて勉強開始。

駄目だ

実家じゃ集中できない!全く進まない!!負債が溜まる!!!

 

学習開始からの期間 :24日目
今日までの合計時間:210.0h
今日までに到達すべき目標時間:219.2h
目標との解離:-9.2h

 

10,000時間」まで、

残り・・・「9790時間!」