- 公開日
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
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
ポイントとしては引数に置いたヒアドキュメントの識別子を丸括弧で一度閉じることができるという点です。