概要
Rubyのヒアドキュメント(行指向文字列リテラル)について簡潔に要点をまとめます。
複数行に渡る長い文字列をスッキリ書けます。
識別子の種類
<<識別子
word = <<TEXT
長い長い文字列をヒアドキュメントで簡潔に書こう。
長いSQLを叩く時も、ヒアドキュメントを利用すれば上手く書けます。
TEXT
#"長い長い文字列をヒアドキュメントで簡潔に書こう。\n長いSQLを叩く時も、ヒアドキュメントを利用すれば上手く書けます。\n"
#識別子は、自由につける事が出来ます。
word = <<LIGHTTEXT
長い長い文字列をヒアドキュメントで簡潔に書けるよ。
長いSQLを叩く時も、ヒアドキュメントを利用すれば上手く書けるよ。
LIGHTTEXT
#"長い長い文字列をヒアドキュメントで簡潔に書けるよ。\n長いSQLを叩く時も、ヒアドキュメントを利用すれば上手く書けるよ。\n"
###<< -識別子
<< -をつけると、終端のEOS(SOUND)をインデントさせる事が出来ます。
class Animal
def roar
<<-SOUND
grrr
baww
SOUND
end
#" grrr\n boww\n"
<< ~識別子
~(チルダ)を識別子の手前に置くと、内部の文字列をインデントさせても、先頭の空白部分が無視されます。
class Animal
def roar
<<~SOUND
grrr
baww
SOUND
end
#"grrr\nboww\n"
式としての識別子
メソッド引数としてもヒアドキュメントを使用出来ます。
(引数呼び出し時に、()で冒頭識別子を閉じる必要があるので、その点に注意が必要です。)
lang = "Japanese"
lang.prepend(<<TEXT)
English
Chinese
TEXT
#" English\n Chinese\nJapanese"
引数として渡す場合でも、上記の~や-を使用しインデント付与や先頭の空白文字除去が可能です。
lang.prepend(<<~TEXT)
English
Chinese
TEXT
#"English\nChinese\nJapanese"
lang.prepend(<<-TEXT)
English
Chinese
TEXT
#" English\n Chinese\nEnglish\nChinese\nJapanese"
SQLのクエリを引数として渡す際にも、ヒアドキュメントが使えます。
Post.find_by_sql(<<~QUERY)
SELECT p.title, b.author
FROM posts p, books b
WHERE p.id = b.post_id
QUERY
複数の引数の一部にのみ、ヒアドキュメントを使用する事も出来ます。
class Vihicle
def run(city: "tokyo road", time: "12:00", speed: nil)
p "run on #{city} at #{time} by #{speed}"
end
end
car = Vihicle.new()
car.run(time:<<~TIME, speed: "100km")
24:00
TIME
#"run on tokyo road at 24:00\n by 100km"
ワンラインで複数のヒアドキュメントの一括指定も可能です。
#Ruby 2.7.0 リファレンスマニュアルより引用
print <<FIRST_DOC, <<SECOND_DOC
これは一つめのヒアドキュメントです。
まだ一つめです。
FIRST_DOC
この行からは二つめのヒアドキュメントです。
この行で終わります。
SECOND_DOC
メソッド呼び出し
word = <<TEXT.upcase
Chao,
Goodbye
TEXT
#"CHAO,\nGOODBYE\n"
参考
リテラル (Ruby 2.7.0 リファレンスマニュアル)
Rubyのヒアドキュメントの書き方いろいろ
プロを目指す人のためのRuby入門