ヒアドキュメントの基本
Rubyのヒアドキュメントは、複数行にわたる長い文字列を扱う際に非常に便利な機能です。以下にその基本的な使い方を説明します。
ヒアドキュメントは「<<」の識別子を使用して表現します。識別子の後ろにヒアドキュメントの始まりと終わりを示す文字列の識別子を書きます。この識別子は任意のものを使用できますが、一般的にはEOS
(End Of String)やEOL
(End Of Line)がよく使われます。
以下に具体的な例を示します。
json = <<'EOS'
{
"language": "Ruby"
}
EOS
この例では、EOS
がヒアドキュメントの始まりと終わりを示す識別子として使用されています。<<'EOS'
から次に出てくるEOS
までの間に記述された内容が文字列として扱われます。このように、ヒアドキュメントを使用することで、複数行にわたる長い文字列を見やすく、また管理しやすく記述することができます。
変数・定数の展開
Rubyのヒアドキュメントでは、変数や定数を文字列内で展開することが可能です。これにより、動的な文字列を生成することができます。
ヒアドキュメントの始まりと終わりを示す識別子をダブルコーテーションで囲うか、コーテーション無しの識別子を使うことで、変数・定数の展開が可能になります。シングルコーテーションを使うと展開されません。
以下に具体的な例を示します。
lang = 'language'
RUBY = 'Ruby'
json = <<"EOS" # ここをダブルコーテーションで囲う
{
"#{lang}": "#{RUBY}"
}
EOS
json = <<EOS # コーテーション無しでもOK
{
"#{lang}": "#{RUBY}"
}
EOS
この例では、lang
とRUBY
という変数と定数がヒアドキュメント内で展開されています。展開する際には#{}
を使用します。このように、ヒアドキュメントを使用することで、動的な文字列を簡単に生成することができます。
インデントの調整
Rubyのヒアドキュメントでは、インデントを調整するための特殊な記法が提供されています。これにより、コードの見た目を整えることができます。
ヒアドキュメントの始まりを示す識別子の前に-
(ダッシュ)を付けると、終端の識別子をインデントすることができます。これにより、ヒアドキュメントが含まれるコードブロックのインデントを保つことができます。
また、Ruby 2.3以降では、識別子の前に~
(チルダ)を付けることで、ヒアドキュメント内のインデントを自動的に調整することができます。これにより、ヒアドキュメント内の文字列の先頭にある空白を自動的に削除することができます。
以下に具体的な例を示します。
def hello
puts <<-EOS
Hello, World!
EOS
end
hello
この例では、-
(ダッシュ)を使用して終端のEOS
をインデントしています。これにより、def
からend
までのコードブロックのインデントが保たれています。
def hello
puts <<~EOS
Hello, World!
EOS
end
hello
この例では、~
(チルダ)を使用してヒアドキュメント内のインデントを自動的に調整しています。これにより、Hello, World!
の先頭にある空白が自動的に削除されています。
eachメソッドとの組み合わせ
Rubyのヒアドキュメントとeachメソッドを組み合わせることで、動的に複数行の文字列を生成することが可能です。これは、例えば、配列の各要素を順に処理して、その結果をまとめて一つの文字列として出力したいときなどに便利です。
以下に具体的な例を示します。
languages = ['Ruby', 'Python', 'JavaScript']
result = languages.each_with_index.map do |lang, i|
<<~EOS
#{i+1}. #{lang}
EOS
end.join
puts result
この例では、languages
という配列の各要素に対して、ヒアドキュメントを用いて文字列を生成し、それをresult
という一つの文字列にまとめています。each_with_index
メソッドを使用することで、各要素とそのインデックスを取得し、それをヒアドキュメント内で展開しています。最後にjoin
メソッドを使用して、生成した各文字列を一つにまとめています。
このように、ヒアドキュメントとeachメソッドを組み合わせることで、複雑な文字列の生成を簡単に行うことができます。