Ruby のヒアドキュメントすごい

  • 76
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

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

まとめ

すごい.