その他

Rubyのヒアドキュメント実例解説

この記事は約5分で読めます。

こんにちは、株式会社インプルの宮﨑です。

今回はRubyのヒアドキュメントについて実例を交えながら解説していきたいと思います。

確認環境

try rubyにて、CRuby 3.2.0で検証を行なっています。

そもそもヒアドキュメントって何?

ヒアドキュメントとは `<<識別子’ を含む行の次の行から `識別子’ だけの行の直前までを文字列とする行指向のリテラルです。(リファレンスマニュアルより)

here_document = <<EOS
Hello world
 Hello Ramble
EOS

puts "here_document"
puts here_document

というコードを走らせると

here_document
Hello world
 Hello Ramble

と出力されます。ヒアドキュメントを利用しない場合で

test ="Hello world \n Hello Ramble"

puts "test"
puts test

というコードを走らせると

test
Hello world 
 Hello Ramble

ヒアドキュメントで記載されたものと同じものが出力されます。
メール文のような長文だと\nで改行して1行で記載するよりもヒアドキュメントで記載する方が視認性が高い場合があるので、覚えておいて損はないかと思います。

式を展開する場合

先ほどの例に出したコードでも式を展開することができます。

ramble_str = "Ramble"

here_document = <<EOS
Hello world
 Hello #{ramble_str}
EOS

puts "here_document"
puts here_document
here_document
Hello world
 Hello Ramble

また、識別子にダブルクォート(“)をつけた場合も同じく式展開することができます。

ramble_str = "Ramble"

here_document = <<"EOS"
Hello world
 Hello #{ramble_str}
EOS

puts "here_document"
puts here_document
here_document
Hello world
 Hello Ramble

式を展開しない場合

識別子にシングルクォート(‘)をつけた場合、式が展開されず、そのまま出力されます。

ramble_str = "Ramble"

here_document = <<'EOS'
Hello world
 Hello #{ramble_str}
EOS

puts "here_document"
puts here_document
here_document
Hello world
 Hello #{ramble_str}

終端行をインテンドする場合

ramble_str = "Ramble"

here_document = <<EOS
Hello world
 Hello #{ramble_str}
 EOS

puts "here_document"
puts here_document

というコードでは

<anonymous>': : eval:3: can't find string "EOS" anywhere before EOF (SyntaxError)

と文法エラーが発生します。エラーの原因は2回目のEOS(終端行)の前にある空白です。

終端行の前に空白がある場合にも対応する場合は1回目の識別子の前に”-“をつけます。

ramble_str = "Ramble"

here_document = <<-EOS
Hello world
Hello #{ramble_str}
 EOS

puts "here_document"
puts here_document

すると2回目のEOS(終端行)の前に空白やインテンドがある場合でも

here_document
Hello world
 Hello Ramble

と出力することができます。

各行のインテンドを左に寄せる場合

ramble_str = "Ramble"

here_document = <<EOS
	Hello world
	Hello #{ramble_str}
EOS

puts "here_document"
puts here_document

というコードだと、行のインテンドが保持された状態で出力されます。

here_document
	Hello world
	Hello Ramble

各行のインテンドを削除し左に寄せて出力する場合は”<<~”を利用します。

ramble_str = "Ramble"

here_document = <<~EOS
	Hello world
	Hello #{ramble_str}
EOS

puts "here_document"
puts here_document

と先ほどのコードに”~”を追加すると

here_document
Hello world
Hello Ramble

のように出力されます。

おまけ

ちなみに`<<識別子’はEOSじゃなくてもできます。

here_document = <<ramble
Hello world
 Hello Ramble
ramble

puts "here_document"
puts here_document

というコードでも

here_document
Hello world
 Hello Ramble

と出力されます。また、よくヒアドキュメントの識別子として利用されている
EOSは(End Of String)の略、EOL(End Of Line)の略です。

参考資料

Ruby 3.3 リファレンスマニュアル