こんにちは、株式会社インプルの宮﨑です。
今回は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)の略です。