プログラミングをしていると、JSONやSQL、ファイル中の文字列等の複数行の文字列を扱いたい時があります。
複数行の文字列を見たままの状態でプログラムに埋め込みたい場合に有用なのが、ヒアドキュメントです。
ヒアドキュメントが使えることで、プログラミングの幅が広がり、シンプルで分かりやすいプログラムを書くことができるようになります。
本記事では、Rubyのヒアドキュメントについて解説します。
記事内に記載しているプログラムは、Ruby2.7.1を使って動作確認をしています。
Rubyのヒアドキュメント
Rubyのヒアドキュメントとして、以下の内容を解説します。
- ヒアドキュメントの基本形
- ヒアドキュメントのインデント
- 識別子のインデント
- ヒアドキュメント内の変数展開
- ヒアドキュメントのメソッドへの適用
- ヒアドキュメントによるコマンドの実行
- 複数のヒアドキュメント
ヒアドキュメントの基本形
まずは基本形ですが、ヒアドキュメントは対象とする文字列を「<<」と「識別子」で括って、
<<識別子 文字列 文字列 ・・・ 識別子
と表します。
例えば、
<<EOS ヒアドキュメント1行目 ヒアドキュメント2行目 EOS
となります。
「EOS」は識別子で、慣例で識別子はEOS(End Of String)やEOL(End Of Line)とされることが多いですが、特に決まりはないので最初と最後の識別子が一致していれば何でも良いです。
JSONを表すなら「JSON」、SQLなら「SQL」など文字列の内容に合った識別子を付けることも多いです。
このヒアドキュメントを使うには、例えば標準出力するprintと合わせて、
print <<EOS ヒアドキュメント1行目 ヒアドキュメント2行目 EOS
とすると、実行結果は
ヒアドキュメント1行目 ヒアドキュメント2行目
となります。
ヒアドキュメントのインデント
JSONは見やすいようにインデントされていることが多いですが、これをヒアドキュメントとして使う場合にも、見た目通りにインデントされている望ましいと思います。
その場合には、チルダを入れて「<<~識別子」とします。
print <<~EOS { "str1": "ヒアドキュメント1行目", "str2": "ヒアドキュメント2行目" } EOS
上記のプログラムを実行すると、インデントもそのまま扱われて、以下の結果となります。
{ "str1": "ヒアドキュメント1行目", "str2": "ヒアドキュメント2行目" }
識別子のインデント
先程はヒアドキュメント自体のインデントでしたが、識別子もインデントすることができます。
通常、終わりの識別子は、行の先頭に記述することがルールとなっています。
ですが、関数の中や、if文、for文等のインデントがある中ではインデントがないと見づらくなってしまいます。
def print_heredoc print <<EOS ヒアドキュメント1行目 ヒアドキュメント2行目 EOS # <- 終わりの識別子が行頭にないといけない end
このような場合に、識別子自体をインデントさせるために、ハイフンを入れて「<<-識別子」とします。
def print_heredoc print <<-EOS ヒアドキュメント1行目 ヒアドキュメント2行目 EOS # <- 終わりの識別子をインデントして分かりやすくできる end
ヒアドキュメントの内容が変わるわけではありませんので、上記のプログラムの実行結果は、通常時と変わらず以下となります。
ヒアドキュメント1行目 ヒアドキュメント2行目
ヒアドキュメント内の変数展開
ヒアドキュメント内の文字列に対して、変数展開を行う事ができます。
変数展開を行うには、識別子を「識別子」のままとするか、ダブルクォートで括って「”識別子”」とします。
str = "変数展開" print <<EOS #{str}1行目 #{str}2行目 EOS print <<"EOS" #{str}3行目 #{str}4行目 EOS
上記のプログラムは、どちらも変数展開されて、以下の結果となります。
変数展開1行目 変数展開2行目 変数展開3行目 変数展開4行目
ちなみにシングルクォートで括った場合は、変数展開されずにそのまま出力されます。
str = "変数展開されない" print <<'EOS' #{str}1行目 #{str}2行目 EOS
上記のプログラムの実行結果は以下となります。
#{str}1行目 #{str}2行目
ヒアドキュメントのメソッドへの適用
ヒアドキュメントは、そのままメソッドの引数として指定することができます。
def print_str(str1, str2, str3) print "#{str1}。#{str2}。#{str3}。" end str3 = "3つ目" print_str("1つ目", <<EOS, str3) 2つ目は ヒアドキュメント EOS
識別子の次の行以降がヒアドキュメントになるので、上記のように識別子のあとにも引数を指定することが可能です。
上記のプログラムの実行結果は以下となります。
1つ目。2つ目は ヒアドキュメント 。3つ目。
また、「<<識別子」を式として扱うことができるので、ヒアドキュメントに対してメソッドの呼出しを行うこともできます。
print <<EOS.upcase Hello Ruby EOS
上記のプログラムでは、ヒアドキュメントに対して大文字に変換するupcaseメソッドを呼出しています。
プログラムの実行結果は以下となります。
HELLO RUBY
ヒアドキュメントによるコマンドの実行
ヒアドキュメントを使って複数行のOSコマンドを一気に実行することができます。シェルスクリプトのヒアドキュメントでもよく使われるパターンです。
OSコマンドを実行するには、識別子をバッククォートで括って、「`識別子`」とします。
print <<`EOS` echo "現在の日時は" date echo "です。" EOS
ヒアドキュメント内の各行がOSのコマンドとして実行されます。
上記のプログラムの実行結果は以下となります。
現在の日時は 2020年 12月 3日 木曜日 11:42:35 JST です。
複数のヒアドキュメント
1行に複数のヒアドキュメントを書くこともできます。
print <<EOS1, <<EOS2 1つ目のヒアドキュメント1行目 1つ目のヒアドキュメント2行目 EOS1 2つ目のヒアドキュメント1行目 2つ目のヒアドキュメント2行目 EOS2
実行結果は以下となります。
1つ目のヒアドキュメント1行目 1つ目のヒアドキュメント2行目 2つ目のヒアドキュメント1行目 2つ目のヒアドキュメント2行目
まとめ
Rubyのヒアドキュメントについてまとめると以下になります。
- Rubyのヒアドキュメントは、「<<識別子」で表される。
- インデントや変数展開も自在に行える。
- メソッドの引数や呼出しを行うこともできる。
ヒアドキュメントは便利な機能なので、使えそうな場面があったらぜひ試してみてもらいたいと思います。
今回Rubyのヒアドキュメントについて解説しました。
以上、参考になれば幸いです。
コメント