Rubyで開発を進めていると、SQL文やHTML、コマンドなど、複数行にわたる長い文字列をコードの中に書きたい場面が出てきます。
\n
を使って改行を表現することもできますが、長くなればなるほど可読性が下がり、編集も大変になってしまいます。
そんな悩みをスマートに解決してくれるのが、Rubyの「ヒアドキュメント」という機能です。
この記事では、Rubyにおけるヒアドキュメントの基本的な使い方から、多くの人がつまずきがちな「インデント」の問題を綺麗に解決するモダンな書き方、そして実務で役立つ応用テクニックまで、わかりやすく解説していきます。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
受講生から評判の良いプログラミングスクール
スクール |
特徴 |
受講料金 |
大手比較サイトで4年連続人気NO.1!受講生からの評判も非常に高く、Web系のエンジニアを目指すならRUNTEQ一択。 | 657,000円 (最大約53万円の給付金が適用される) |
|
月単価80万円以上の現役エンジニア講師による指導!一度入会すればサポートは半永久的。 | 498,000円 |
|
格安で質の高いWeb制作スキルを習得したい人におすすめ!業界最安級の料金でありながら、コミュニティやサポートが充実。 | 129,800円~ |
|
完全無料でプログラミングが学べる貴重なスクール!最短1ヶ月で卒業可能。ゼロスク運営会社への就職もできる。 | 完全無料 |
|
長期間に渡って学習し、希少人材を目指す人に最適なスクール!受講料は高いものの、高収入を得られる人材を目指せる。 | 96~132万円 |
Rubyのヒアドキュメントとは?
ヒアドキュメントは、複数行にわたる文字列を、見た目そのままに直感的に記述するための仕組みです。
「Here Document(ここにあるドキュメント)」という名前の通り、ソースコード中の特定の部分に、まとまった文章を埋め込むことができます。
例えば、改行を含む文字列を通常の文字列リテラルで書くと、以下のようになります。
message = "こんにちは。\nRubyの世界へようこそ。\n楽しんでいってください。"
puts message
実行結果は以下の通りです。
こんにちは。
Rubyの世界へようこそ。
楽しんでいってください。
これをヒアドキュメントで書くと、次のようになります。
message = <<EOS
こんにちは。
Rubyの世界へようこそ。
楽しんでいってください。
EOS
puts message
実行結果は同じですが、ヒアドキュメントの方が改行をそのまま記述できるため、より自然で読みやすいコードになっていることがわかります。
ヒアドキュメントの基本的な書き方
ヒアドキュメントの構文は非常にシンプルです。
<<識別子
複数行の文字列 識別子
<<
に続けて「識別子」となる任意の文字列(慣習的に大文字の英字が使われます。例:EOS
, SQL
, HTML
)を記述して開始し、同じ識別子が行の先頭に現れた時点で終端となります。
変数や式を展開する
ヒアドキュメントは、ダブルクォートで囲まれた文字列と同じように、#{}
を使って変数や式の結果を展開(埋め込み)できます。
name = "山田"
lang = "Ruby"
profile = <<PROFILE
ようこそ、#{name}さん。
一緒に#{lang}を学びましょう。
PROFILE
puts profile
実行結果は以下の通りです。
ようこそ、山田さん。
一緒にRubyを学びましょう。
【最重要】インデント問題を解決する3つの記法
ヒアドキュメントを使う上で、誰もが一度は直面するのがインデント(字下げ)の問題です。
コードの見た目を綺麗に保つために、ヒアドキュメント全体をインデントしたいのですが、記法によって挙動が異なります。
ここでは、3つの記法の違いを詳しく見ていきましょう。
1. <<EOS(記号なし)- 基本形
最も基本的なこの記法では、終端の識別子EOS
をインデントすることができません。
必ず行の先頭に記述する必要があります。
def some_method
text = <<EOS
これはヒアドキュメントです。
終端の識別子はインデントできません。
EOS
puts text
end
some_method
もし終端のEOS
をインデントしてしまうと、それは終端とはみなされず、エラーの原因となります。
この制約のため、コード全体のインデントが崩れてしまい、読みにくくなるのが欠点です。
2. <<-EOS(ハイフン)- 終端のインデントを許可
ハイフンを付けた<<-
という記法を使うと、終端の識別子をインデントできるようになります。
これにより、メソッドの中などで使っても、コードのインデントを揃えることが可能です。
def some_method
text = <<-EOS
これはインデントされたヒアドキュメントです。
ただし、本文のインデントはそのまま出力されます。
EOS
puts text
end
some_method
実行結果は以下の通りです。
これはインデントされたヒアドキュメントです。
ただし、本文のインデントはそのまま出力されます。
終端のEOS
をインデントできるようになったのは大きな進歩ですが、ご覧の通り、本文の先頭にある余分な空白(インデント)までそのまま出力されてしまいます。
3. <<~EOS(チルダ)- 最も推奨されるモダンな方法
このインデント問題を完全に解決してくれるのが、チルダ(~
)を使った<<~
という記法です。
これは「Squiggly Heredoc」とも呼ばれます。
この記法は、終端識別子のインデントを許可し、さらに本文の各行の先頭にある「最も浅いインデント」を基準に、余分な空白を自動的に取り除いてくれます。
def some_method
text = <<~EOS
これはインデントされたヒアドキュメントです。
チルダを使えば、本文のインデントが
綺麗に取り除かれます。
EOS
puts text
end
some_method
実行結果は以下の通りです。
これはインデントされたヒアドキュメントです。
チルダを使えば、本文のインデントが
綺麗に取り除かれます。
コードの見た目はインデントされていて読みやすく、実際の出力結果からは余計な空白が消えています。
Ruby 2.3以降で利用可能で、現在のRuby開発では、この<<~
記法を使うのが最も一般的で推奨される方法です。
Rubyのヒアドキュメントの応用テクニック
ヒアドキュメントには、さらに便利な使い方がいくつかあります。
ここでは、知っておくと役立つ応用テクニックを紹介します。
変数展開を無効にする (<<'EOS')
ヒアドキュメント内で#{}
による変数展開をさせたくない場合は、開始の識別子をシングルクォート'
で囲みます。
code_snippet = <<'CODE'
Rubyの変数展開は、
#{variable} という形式で書きます。
CODE
puts code_snippet
実行結果は以下の通りです。
Rubyの変数展開は、
#{variable} という形式で書きます。
#{variable}
がそのままの文字列として扱われているのが分かります。
これは、コードのサンプルなどを文字列として埋め込みたい場合に非常に便利です。
メソッドの引数として使う
ヒアドキュメントは、メソッドの引数として直接渡すこともできます。
def display(text)
puts "--- メッセージ ---"
puts text
puts "------------------"
end
display(<<~MESSAGE)
これは引数として渡された
ヒアドキュメントです。
MESSAGE
実行結果は以下の通りです。
--- メッセージ ---
これは引数として渡された
ヒアドキュメントです。
------------------
実践的なユースケース
最後に、実際の開発現場でヒアドキュメントがどのように活用されているか、具体的な例を見てみましょう。
SQLクエリの記述
複数行にわたる複雑なSQL文を、読みやすく記述するのにヒアドキュメントは最適です。
user_id = 123
sql = <<~SQL
SELECT
users.id,
users.name,
profiles.age
FROM
users
INNER JOIN
profiles ON users.id = profiles.user_id
WHERE
users.id = #{user_id};
SQL
puts sql
実行結果は以下の通りです。
SELECT
users.id,
users.name,
profiles.age
FROM
users
INNER JOIN
profiles ON users.id = profiles.user_id
WHERE
users.id = 123;
HTMLスニペットの埋め込み
メールの本文や、ちょっとしたHTMLテンプレートをコード内に記述する際にも役立ちます。
title = "ヒアドキュメント"
body = "これはとても便利です。"
html = <<~HTML
<!DOCTYPE html>
<html>
<head>
<title>#{title}</title>
</head>
<body>
<p>#{body}</p>
</body>
</html>
HTML
puts html
まとめ
Rubyのヒアドキュメントについて、基本的な使い方からインデント問題の解決法、応用テクニックまでを解説しました。
なお、Rubyを体系的に学んだり、Rubyのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。
特にRuby+Railsを学ぶ場合は、群を抜いて評判の良い「RUNTEQ」を強くおすすめします。