アインシュタインの電話番号
2011.01.19
Rubyのヒアドキュメントは高機能

YAMLについて調べててRubyのリファレンスマニュアルを見たら、かっこいい記述がされててRubyのヒアドキュメントが高機能な事を知った。以下まとめ。

Rubyのヒアドキュメント

普通のヒアドキュメント

puts <<EOS
普通のヒアドキュメント
EOS

インデント対応

def hoge(word = nil)
  puts <<-EOS
    <<- のようにマイナス記号を付加すると
    終了ラベルをインデントしてもおkになる
    細かいことだけどこれは#{word}重要
  EOS
end
hoge 'とても'

複数指定可能

puts <<HOGE, <<FUGA
こんな感じで1つの行に複数の開始ラベルを書くことで
HOGE
複数のヒアドキュメントを定義できる
FUGA

オブジェクトとして扱える

puts <<EOS.split("\n")[2..3].join
一番面白いと思ったのは
開始ラベルの <<EOS は式なので
戻り値のStringに対してメソッドを
呼び出せること
EOS

上の出力結果は以下

戻り値のStringに対してメソッドを呼び出せること

PHPで書くと

PHPのヒアドキュメントは上記のRubyと比べると、終了ラベルのインデントはできない、1行に複数は書けない、開始ラベルがオブジェクトにはならないのでメソッドは呼び出せない、あたりに違いがあるっぽい。あと終了ラベルの最後にセミコロンが必要(一部除く)。

<?php
echo <<<EOS
普通のヒアドキュメント
EOS;

インデントは不可

<?php
echo <<<EOS
終了ラベルはインデントできないので、これはParse error
  EOS;

複数定義も不可

<?php
echo <<<HOGE, <<<FUGA
ひとつの行に複数ヒアドキュメントを定義するのはできないので
HOGE;
これもParse errorになる
FUGA;

関数の引数に指定可能

<?php
var_dump(array(<<<EOS
関数の引数に使用することは可能
その時は終了ラベルにセミコロンを付けると
Parse errorになってしまうので注意
EOS
));

変数への代入も可能

<?php
$hoge = <<<EOS
変数に入れることも可能
EOS;
echo $hoge;

ただし、こちらの記事でも触れられているように、インデントできないというのは、サンプルコードと違って実際のコード上ではかなり見た目が崩れることになってしまうので、なかなか使いづらいかもしれない。


ヒアドキュメント (行指向文字列リテラル) PHP: 文字列 - Manual