akishin999の日記

調べた事などを書いて行きます。

Ruby のヒアドキュメントのあまり見かけない使い方

最近知った Ruby のヒアドキュメントのあまり見かけない(?)機能をいくつか備忘録としてまとめてみました。

メソッドの引数に渡せる

以下のようにしてヒアドキュメントをメソッドの引数にそのまま渡せます。

def here_method(arg1, arg2, arg3)
  puts arg1
  puts arg2
  puts arg3
end

here_method("hoge", <<EOS, "fuga")
  foo
  bar
  baz
EOS

# => hoge
       foo
       bar
       baz
     fuga

複数のヒアドキュメントを引数として渡すことも可能だったりします。
こうなるともう何がなんだか・・・。

here_method("arg1", <<EOS1, <<EOS2)
  foo
  bar
  baz
EOS1
  HOGE
  FUGA
EOS2

# => arg1
       foo
       bar
       baz
       HOGE
       FUGA

メソッドのレシーバになれる

ヒアドキュメントをレシーバにしてメソッドを呼び出せます。

puts <<LABEL.upcase
The quick brown fox 
jumps over the lazy dog.
LABEL

# => THE QUICK BROWN FOX 
     JUMPS OVER THE LAZY DOG.

バックスラッシュでのコマンド実行

開始ラベルをバックスラッシュで囲む事でヒアドキュメントをコマンドとして実行できたりします。
1 行に 1 コマンドずつ書くと複数コマンドを実行できます。

print <<`EOC`
date
ls -la
whoami
pwd
EOC


特にメソッドの引数に指定する書き方は見慣れない事もあって、初めて見たときはびっくりしました。
使い慣れているつもりの言語でも調べてみると知らない機能いっぱいありますね。
まだまだ勉強不足でした。

参考

ヒアドキュメント (行指向文字列リテラル)
http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fliteral.html#here