179
144

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

まとめ

すごい.

179
144
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
179
144

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?