Ruby のヒアドキュメントは行指向の文字列リテラルで,まとまったテキストを書くのに向いています.
puts <<-EOS
foo
bar
baz
EOS
- 出力
foo
bar
baz
メソッドチェーンをつなげる
たとえばヒアドキュメントの中身をすべて小文字にしたいときは下記のようにします.メソッドチェーンをつなげる位置がやや直感的でないですが,cat
コマンドがそんな感じですね.
puts <<-EOS.downcase
FOO
BAR
BAZ
EOS
- 出力
foo
bar
baz
余計なインデントを取り除く
Ruby のヒアドキュメントはインデントを考慮しないため,ソースコードのインデントを崩して書くか,unindent gem のようなメソッドを String
に生やす必要がありました.
def usage
<<-USAGE
blah [option] {file}
--version show version
--help show this help
USAGE
end
def usage
<<-USAGE.unindent
blah [option] {file}
--version show version
--help show this help
USAGE
end
Ruby 2.3 からは専用の構文が入り,次のように書けば良くなりました.すごい.
def usage
<<~USAGE
blah [option] {file}
--version show version
--help show this help
USAGE
end
メソッド呼び出しの引数
<<-IDENT
の部分が1つの式になるような感じなので,次のように文字列部分をぶらさげるように書けます.
puts JSON.parse(<<-JSON, symbolize_names: true, max_nesting: 10)
{
"answer": 42,
"heredoc": "sugoi"
}
JSON
複数のヒアドキュメント
よって,次のようにして複数のヒアドキュメントを1つの式に含めることができます.
puts <<-STR1, <<-STR2
this is first
string
STR1
this is second
string!
STR2
- 出力
this is first
string
this is second
string!
クワイン
ヒアドキュメントの identifier 部分は異常に自由度が高いので,
それを応用して,次のようなクワインが書けるようです.僕が考えたわけではなく拾い物です.
puts <<2*2,2
puts <<2*2,2
2
気になる方は手元で動かしてみてどうなっているのか見てみてください.
$ ruby quine.rb > result
$ diff quine.rb result
まとめ
すごい.