LoginSignup
0
0

More than 1 year has passed since last update.

Rubyのヒアドキュメント (行指向文字列リテラル)について

Posted at

概要

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入門

0
0
0

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
0
0