Rubyでヒアドキュメントを使う方法|基本構文から式展開・波ヒアドキュメントまで徹底解説
ヒアドキュメントとは?
ヒアドキュメント(heredoc)とは、元のインデントやフォーマットを維持したまま、複数行の文字列を定義するための記法です。
SQLやHTMLといったコードの断片をプログラム内に埋め込む際によく活用されます。
以下は具体的な例です:
query = <<-SQL SELECT * FROM food WHERE healthy = true SQL
この構文を使うことで、Rubyでヒアドキュメントを定義できます。
書き方はシンプルです。まず <<- という記号に続き、ヒアドキュメントの名前となる識別子(ここでは SQL)を指定します。次の行からが文字列の内容となり、最後に同じ識別子だけを単独の行に書くことで閉じます。
%Qを使った別の書き方
%Q を使って同様のことを実現することもできます:
query = %Q( Article about heredocs )
ただし、この方法では文字列の先頭と末尾に余分な改行が含まれてしまう点に注意が必要です。ヒアドキュメントを使うか、strip メソッドを呼び出すことで、この問題を解消できます。
末尾の改行を含まないRubyのヒアドキュメントは、次のように chomp を組み合わせて書きます:
query = <<-HTML.chomp Article about heredocs HTML
ヒアドキュメントでの式展開(インターポレーション)
「ヒアドキュメントの中でも式展開は使えるのだろうか?」と思った方もいるかもしれません。
答えはイエスです!
例を見てみましょう:
type = "healthy"
table = "food"
query = <<-SQL
SELECT * FROM #{table}
WHERE #{type} = true
SQL
逆に、式展開を無効化したい場合は、識別子をシングルクォートで囲みます。
次のようなイメージです:
doc = <<-'TIME'
Current time is #{Time.now}
TIME
この場合、#{Time.now} は評価されず、そのまま文字列として出力されます。
波ヒアドキュメント(Squiggly Heredoc)でインデントを削除する
「各行の先頭にある余分なインデントを取り除きたい」と思ったことはありませんか?
それを実現してくれるのが波ヒアドキュメント(squiggly heredoc)です。
Ruby 2.3で導入されたこの記法では、共通のインデントを自動的に取り除いてくれます。
比較してみましょう:
page = <<-HTML Heredocs are cool & useful HTML # " Heredocs are cool & useful\n" page = <<~HTML Heredocs are cool & useful HTML # "Heredocs are cool & useful\n" page = <<~HTML.strip Heredocs are cool & useful HTML # "Heredocs are cool & useful"
これにより、ソースコード上ではインデントを付けて可読性を保ちながら、実際に生成される文字列には余分な空白を含めないようにできます!
まとめ
この記事では、Rubyでヒアドキュメントを使ってコード内に複数行の文字列を埋め込む方法を学びました。テストコードの作成や、ファイルを読み込まずに小さなデータを手軽に扱いたい場面などで非常に役立ちます。
最後までお読みいただきありがとうございました!
-
Rubyのエイリアス(別名定義)完全ガイド:aliasキーワードとalias_methodの違い
Rubyでは、既存のメソッドに別名(エイリアス)を付ける方法が2つあります。 alias(キーワード) alias_method(メソッド) どちらも同じ目的で使えますが、挙動が微妙に異なるため、初心者にとって混乱しやすいトピックです。 本記事では、両者の違いを詳しく掘り下げ、しっかりと理解できるように解説していきます。 aliasキーワードとは まずはaliasから見ていきましょう。aliasはRubyのキーワードの一つです(ifやdef、classなどと同じ扱いです)。 基本的な書き方は以下の通りです。 alias print_something puts print_someth
-
RubyのStructとOpenStructの使い方を徹底解説!値オブジェクトを簡単に作る方法
Rubyには、関連する属性をまとめて保持する「値オブジェクト」を手軽に作れるStructという組み込みクラスが用意されています。本記事では、Structの基本的な使い方から注意点、そしてOpenStructとの違いまで詳しく解説します。 そもそもStructとは何か? StructはRubyに組み込まれたクラスで、新しいクラスを動的に生成し、値オブジェクト(Value Object)を作成するために使われます。値オブジェクトとは、関連性のある複数の属性をひとまとめにして扱うためのオブジェクトです。 具体例を挙げてみましょう。 2つの座標(xとy)を持つPointというデータを表したい場合、この