Rubyなら改行を含む複数行の文字列を扱うヒアドキュメントをプログラムで利用できます。しかもヒアドキュメントの中に変数を埋め込んだり、インデントされた識別子や文字列を扱うことも可能です。Rubyのプログラムの中で長い文字列を扱うなら、ぜひ、ヒアドキュメントを利用してください。
今回はRubyにおけるヒアドキュメントの書き方について、例を使って解りやすく解説します。
ヒアドキュメントとは
Rubyでは、文字列を宣言する際、「”」や「’」といったクォーテーションマークで囲う方法の他に、ヒアドキュメントも使用できます。そして改行を含む長い文字列をプログラムの中で利用する場合はは断然ヒアドキュメントの方が便利です。
このためRubyでプログラミングするなら、ヒアドキュメントを知らないという訳にはいきません。まずはヒアドキュメントの基本について解説します。
ヒアドキュメントの意味
ヒアドキュメントとは、英語のhere documentをカタカナにしたコンピュータ用語で、ソースコードの中に改行を含む文字列を記述する特別な記法を指す言葉です。
一般的にプログラミング言語に文字列を使う場合、「”」や「’」といったクォーテーションマークで囲います。しかし、この方法で改行やタブを含む文字列を記述するには、特別な文字コードを使わなければなりません。
その点、ヒアドキュメントでは文字列の開始を意味する文字列から終端を意味する文字列までの間、改行やタブなどが含まれていてもそのまま文字列として認識されます。「ここはスクリプトではなくドキュメント」という訳です。
シェルスクリプトで使う
ヒアドキュメントがよく使われるのがシェルスクリプトです。なおBashなどのシェルスクリプトには、Linuxなどで使えるコマンドと簡単な制御構造を記述できます。
そして、人がキーボードから入力するような標準入力の文字列をシェルスクリプトに記述しておくことで、あたかも人がキーボードから操作するのと同じようにコマンドを実行することが可能です。
このように改行やタブを含む標準入力をそのまま記述できるのがヒアドキュメントの特徴で、例えばBashのシェルスクリプトでは次のように記述できます。
Bsshのシェルスクリプトに記述したヒアドキュメントの例
cat > out.txt <<EOF このテキストは Rubyで作った ヒアドキュメント です。 EOF
上記の例を実行すると、Linuxのcatコマンドにより、<<EOFの次の行からEOFの前の行までの文字が、out.txtというファイルに書き込まれます。
プログラムの中で使うヒアドキュメント
先ほどシェルスクリプトにおけるヒアドキュメントの使い方を紹介しましたが、Rubyなどのプログラム言語でもヒアドキュメントは利用可能です。そしてプログラム言語におけるヒアドキュメントは、改行やタブを含む長い文字列を利用する際に使用します。
なお一般的に文字列を宣言する場合、次のように「”」や「’」といったクォーテーションマークで囲います。
strs = "Ruby"
それに対してヒアドキュメントを使って文字列を宣言する場合、次のように特別な文字列の「<<識別子」を使います。
strs = <<EOF ここから ... ヒアドキュメントの文字列 ... ここまで EOF
Rubyのヒアドキュメントの文法
先ほど紹介したようにヒアドキュメントは、シェルスクリプトなどでキーボード入力をそのままスクリプトに記述する方法として便利な機能です。さらにプログラミング言語では、長いテキストをプログラムの中に埋め込む際にも活用できます。
そしてRubyもヒアドキュメントをサポートしているので、Ruby on RailsによるWebシステムなどでもいろいろな用途で利用可能です。次からRubyにおけるヒアドキュメントの使い方について紹介します。
「<<識別子」を使う
Rubyでヒアドキュメントを利用するには、「<<識別子」を使います。なお、「<<識別子」とは「<<」の後ろに記述した識別子から、同じものが行の左端に出現するまでの間をヒアドキュメントにする、というものです。
なお識別子として使える文字列に特に決まりはありません。慣例としてよくEOFやEOSといった文字列がよく使われます。次にEOFのような意味を持つ、「<<識別子」と使える文字を紹介します。
EOD (End of Documentの略)
EOF (End of Fileの略)
EOL (End of Lineの略)
EOM (End of Messageの略)
EOS (End of Stringの略)
EOT (End of Textの略)
「<<識別子」の使用例
Rubyでヒアドキュメントを使うとすれば、真っ先に挙げられるのが改行を含む文字列の代入です。次に「<<識別子」としてEOFを使った例を次に紹介します。
js_code1 = <<EOF <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" > </script> EOF puts js_code1
上の例では、「js_code1 = <<EOF」でヒアドキュメントによる文字列の代入であることを宣言しており、これにより行の左端に「EOF」が出現するまでの文字列が変数に代入されます。そのため、変数js_code1を表示すると改行を含む文字列として表示されます。
ヒアドキュメントで変数に埋め込む
Rubyではヒアドキュメントに指定した文字列の中で変数を使い、その変数の値を使った文字列にすることが可能です。その場合、表示したい変数を「#{変数}」と記述します。
lang = "Ruby" flame = "Ruby on Rails" html_str = <<EOF <table> <tr> <td>#{lang}</td> <td>#{flame}</td> </tr> </table> EOF puts html_str
上記は、HTMLの中にRubyの変数のlangおよびflameをヒアドキュメントとして記述したプログラムの例です。この場合、ヒアドキュメントに埋め込んだ変数が展開された文字列がhtml_strに格納されるので、それを表示しています。
インデント付きヒアドキュメント
先ほど「<<識別子」を使ったRubyのヒアドキュメントの使い方を紹介しましたが、識別子に「-」または「~」を付けることで、インデント付きヒアドキュメントを作れます。インデントが必要な個所でヒアドキュメントを使う場合は、必要に応じて「-」または「~」の付いた識別子を利用してください。
次からインデント付きヒアドキュメントの使い方を紹介します。
識別子に「-」を付ける
先ほど紹介したようにヒアドキュメント終了を意味する「<<識別子」は行の左端に書かなければなりません。しかし、識別子に「-」を付けると、終端行を意味する識別子の前に空白やタブを入れることが可能です。
例えばクラスやメソッドの定義の中でヒアドキュメントを使う場合、変数への代入と「<<識別子」はインデントされた位置に記述します。しかし、終端を意味する識別子はインデントされた位置には置けません。この場合、識別子に「-」を付けることで、インデントした位置に記述することが可能です。
識別子に「-」を付けたヒアドキュメントの例
def mes_one() message = <<-EOF これは ヒアドキュメントです。 EOF puts message end mes_one()
これは「-」の付いた識別子「<<-EOS」を使うことで、終端にインデントされたEOSを使った例です。終端となるEOSの前に空白が入ってますが、「-」が付いているので終端として認識してくれます。
識別子に「~」を付ける
「-」の付いた識別子ではインデントされた終端文字を使えましたが、ヒアドキュメントの対象となる行はインデントされていませんでした。「-」の代わりに「~」を使うことで、識別子が使われたインデント位置を基準にヒアドキュメントの対象となる行もインデントされたものとして処理できます。
例えば下記の例を見てください。これはヒアドキュメントの対象となる行もインデントされています。通常の識別子を使うとそれぞれの行に空白が入りますが、「~」の付いた識別子を使うことで、空白の無い文字列として変数に格納されます。
識別子に「~」を付けたヒアドキュメントの例
def mes_one() message = <<~EOF これは mes_one のヒアドキュメントです。 EOF puts message end mes_one()
上の例の実行結果は次のとおりです。
これは mes_one のヒアドキュメントです。
まとめ
これまで紹介したようにRubyではヒアドキュメントが使えて、さらに変数を埋め込めたり、識別子や文字列をインデントして記述することも可能です。また「<<」に続けて識別子を指定すると、その次の行から識別子の前の行までが1つ文字列として扱えるので、プログラムの中で簡単に長い文字列が使えます。
そのためRubyのプログラムの中でHTMLの一部を合成したり、JSONファイルを作るなど、長い文字列を扱う場合は、ぜひヒアドキュメントを利用してください。