Rubyで文字列を表現する場合、主にダブルクォーテーションを使う記法と、シングルクォーテーションを使う記法があります。
[1] pry(main)> "Alice found a bottle" => "Alice found a bottle" [2] pry(main)> 'Alice found a bottle' => "Alice found a bottle"
ダブルクォーテーションを使う記法だと、以降で説明する、式展開とバックスラッシュ記法が使えます。
文字列中に「#{}」を埋め込むと、中括弧の中身がRubyのコードして実行されます。以下の例では、「name」という変数に「Alice」という文字列を格納し、それを式展開して使っています。
[3] pry(main)> name = "Alice" => "Alice" [4] pry(main)> "#{name} found a bottle" => "Alice found a bottle"
C言語に影響を受けた言語の経験者なら、「改行を表す文字として『\n』が使える」ことをご存じかと思います。Rubyでも同様に、改行やタブなどの文字をバックスラッシュを用いて表現できます。
記法 | 意味 |
---|---|
\t | タブ |
\v | 垂直タブ |
\n | 改行 |
\r | キャリッジリターン |
\f | 改ページ |
\b | バックスペース |
\a | ベル |
\e | エスケープ |
\s | 空白 |
\x | 文字「x」そのもの |
少し特殊な文字列の記法として、「%記法」があります。文字列中に、クォーテーションそのものが頻出する場合などに便利です。具体例を以下に示します。
[5] pry(main)> %!Alice found a bottle! => "Alice found a bottle" [6] pry(main)> %Q{Alice found a bottle} => "Alice found a bottle" [7] pry(main)> %q{Alice found a bottle} => "Alice found a bottle"
「%!」と「%Q」はダブルクォーテーションと同様、式展開とバックスラッシュ記法が有効になり、「%q」はシングルクォーテーションと同様の動作となります。
また、「%Q」「%q」に続けて書かれている中括弧の代わりに、任意の文字を使えます。従って、以下のような記法も有効です。
[8] pry(main)> %Q$Alice found a bottle$ => "Alice found a bottle" [9] pry(main)> %q(Alice found a bottle) => "Alice found a bottle"
複数の行にわたって長い文字列を書きたい場合には、ヒアドキュメントが便利です。「EOS」の部分には、好きな文字を識別子として使うことができます。
[10] pry(main)> <<EOS [11] pry(main)> Alice found a bottle [12] pry(main)> labeld "drink me!" [13] pry(main)> EOS => "Alice found a bottle\nlabeld \"drink me!\"\n"
また、識別子の前にハイフン「-」を付けると、終端の「EOS」をインデントできます。
[14] pry(main)> <<-EOS [15] pry(main)> Alice found a bottle [16] pry(main)> labeld "drink me!" [17] pry(main)> EOS => "Alice found a bottle\nlabeld \"drink me!\"\n"
識別子をダブルクォーテーションで囲む「"EOS"」か、上述の例のように囲まない場合は、バックスラッシュ記法と式展開が有効となります。一方で、シングルクォーテーションで囲む「'EOS'」の場合は、バックスラッシュ記法と式展開は無効となります。
文字列リテラルの使い分けほど、Rubyプログラマーによって好みの異なるものはないでしょう。
筆者は、基本的にダブルクォーテーションを使い、文字列中にバックスラッシュが頻出するなどの特段の理由がある場合に限り、シングルクォーテーションを使うスタイルに落ち着いています。%記法はほとんど使いません。
理由としては、次の2点が挙げられます。
シングルクォーテーションを好むRubyプログラマーも多いので、これがベストプラクティスかどうかは分かりません。月並みですが、プロジェクトの慣例に従うのが無難でしょう。
「シンボル」は文字列リテラルに似ていますが、内部的には数値として扱われるデータです。文字列とシンボルは一対一に可換です。シンボルは「:」(コロン)に識別子を続ける形で書きます。
[1] pry(main)> :alice => :alice
また、以下のような書き方もできます。ダブルクォーテーションで囲った場合は、式展開やバックスラッシュ記法が使えます。
[2] pry(main)> :"alice" => :alice [3] pry(main)> :'alice' => :alice [4] pry(main)> %s{alice} => :alice
また、シンボルは常に一意であるため、何度評価されても同じオブジェクトを返します。以下の例では、「:alice」というシンボルオブジェクトと「"alice"」という文字列オブジェクトを3回ずつ生成し、「object_id」メソッドでオブジェクトのIDを取得して比較しています。
文字列の場合は、同じ「"alice"」という文字列データを持っていますが、同一ではないオブジェクトが評価のたびに生成されていることが分かります。
[1] pry(main)> :alice.object_id => 823528 [2] pry(main)> :alice.object_id => 823528 [3] pry(main)> :alice.object_id => 823528 [4] pry(main)> "alice".object_id => 70290639242260 [5] pry(main)> "alice".object_id => 70290639114000 [6] pry(main)> "alice".object_id => 70290638963520
ここでは紹介しきれませんでしたが、他にもコマンド出力、正規表現リテラルなどのリテラルがあります。また、配列オブジェクトやハッシュオブジェクトを生成するためのリテラルもあります。
ここで紹介しなかったリテラルは、以降の連載の、関連の深い回で紹介します。
Copyright © ITmedia, Inc. All Rights Reserved.