Rubyのヒアドキュメント

プログラミング

プログラミングをしていると、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のヒアドキュメントについて解説しました。

以上、参考になれば幸いです。

コメント

タイトルとURLをコピーしました