公開日

Rubyのヒアドキュメントの書き方いろいろ

目次

Rubyの覚えてそうで覚えられないヒアドキュメントの書き方をまとめてみたいと思います。

<<識別子

これがRubyのヒアドキュメントの基本型となります。識別子であるEOSの始点の<<EOSから次に出てくるEOSまでの囲まれている部分が文字列となります。

def hello
  puts <<EOS
    Hello,

    World!
EOS
end

hello

出力結果:

    Hello,

    World!

上記のコードのコメントアウトされている箇所が定義したhelloメソッドの出力結果となります。

<<-識別子

上記のコードは終端のEOSの位置が気に食わないですか? たしかにdef~endの中で一段ネストさせたいですね。-(ダッシュ)を識別子の手前に置けば、こんな書き方が可能です。

def hello
  puts <<-EOS
    Hello,

    World!
  EOS
end

hello

出力結果:

    Hello,

    World!

これで終端のEOSがメソッドの内部でネストされて可読性が上がりましたね。

<<~識別子

でもちょっと待って下さい。本当にほしい文字列は先頭に空白のない文字列だったんです。でも安心してください、Ruby2.3以降は~(チルダ)を識別子の手前に置いてこう書けるんです。

def hello
  puts <<~EOS
    Hello,

    World!
  EOS
end

hello

出力結果:

Hello,

World!

これでHelloという文字列の手前にあるネストの空白も消してくれました。


Tips① GitHub Syntax Highlight

下記のようにGitHub上にてヒアドキュメントの識別子にsyntaxの指定をすると、GitHub syntax highlightが効くようになります。

def a
  doc = <<-RUBY
    def hello
      puts "Hello World!"
    end
  RUBY
end

heredoc

Tips② 引数内のヒアドキュメントの書き方

下記のクエリの実行もヒアドキュメントを使って見やすく書き直すこともできます。

Post.find_by_sql("SELECT p.title, c.author FROM posts p, comments c WHERE p.id = c.post_id")

(引用元: ActiveRecord::Querying | RailsDoc)

Post.find_by_sql(<<~SQL)
  SELECT p.title, c.author
  FROM posts p, comments c
  WHERE p.id = c.post_id
SQL

ポイントとしては引数に置いたヒアドキュメントの識別子を丸括弧で一度閉じることができるという点です。

参考