2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ruby】ヒアドキュメントについて勉強しました

Last updated at Posted at 2024-11-04

どうもこんにちは。

今回は、Rubyのヒアドキュメントについて勉強をしたので、備忘録として残します。

ヒアドキュメントとは

ヒアドキュメントは、複数行にわたる文字列を簡単に扱うための構文です。

基本的な構文

文字列 = <<識別子
ここに複数行のテキストを記述します。
任意の行数だけ続けられます。
識別子

ヒアドキュメントで必要とするのは、識別子です。識別子は、どんな単語を使用しても大丈夫です。ただし、最初と最後の識別子が同じである必要があります。

サンプルコード
message = <<END
こんにちは!
これはヒアドキュメントの例です。
複数行にわたるテキストを簡単に扱えます。
END

puts message

---

#=> こんにちは!
#=> これはヒアドキュメントの例です。
#=> 複数行にわたるテキストを簡単に扱えます。

変数展開や改行コードの扱い

変数展開や改行コードを使用する場合と使用しない場合で、使い分けが可能です。

使用する場合

まず、デフォルトの構文では変数展開や改行コードの使用が可能です。

name = "太郎"
message = <<END
こんにちは、#{name}さん!
今日は良い天気ですね。
END

puts message

#=> こんにちは、太郎さん!
#=> 今日は良い天気ですね。

また、通常の文字列と同様で、識別子を""で括った場合も変数展開や改行コードの使用が可能です。(デフォルトでいいなら使わんですな)

使用しない場合

識別子を''で括った場合、変数展開や改行コードの使用ができなくなります。

name = "太郎"
message = <<'END'
こんにちは、#{name}さん!
今日は良い天気ですね。\n
END

puts message

#=> こんにちは、#{name}さん!
#=> 今日は良い天気ですね。\n

ヒアドキュメントのインデントについて

デフォルトの構文では、以下のようにインデントを含めた状態で出力がされます。

def example
  message = <<-END
    これはインデントされたヒアドキュメントの例です。
    メソッド内でインデントしても問題ありません。
  END
  puts message
end

example

#=>     これはインデントされたヒアドキュメントの例です。
#=>     メソッド内でインデントしても問題ありません。

インデントを含めない状態で出力したい場合は、<<~を使うことで、ヒアドキュメント内の共通のインデントを自動的に削除できます。

def example
  message = <<~END
    これは自動的にインデントが削除されます。
    コードの見た目を損なわずに複数行の文字列を記述できます。
  END
  puts message
end

example

#=> これは自動的にインデントが削除されます。
#=> コードの見た目を損なわずに複数行の文字列を記述できます。

まとめ

Railsアプリケーションで、ERBでロジックを組んでビューをレンダリングするより、コントローラとかでヒアドキュメントを使ってHTMLを生成した方が速いのかなとか思ったりしました。が、ERBにはキャッシュ機構なるものが存在しているようなので、素直にERBを使用した方が良いかもしれませんね。

また、先日のKaigi on RailsでViewComponentを使用する方法についても学ぶことができたので、どこかで試したいです。

以上

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?