Rubyのインデント付きヒアドキュメント <<-EOF の動作を理解する
Rubyのヒアドキュメントには、通常の <<EOF とインデント付きの <<-EOF
こちらの記事は、インデント付きヒアドキュメントの動作について私のメモとしてまとめてます。
<<-EOF の基本動作
インデント付きヒアドキュメント <<-EOF には、重要なポイントが2つ
ポイント① 行頭のスペースは文字列に含まれる
puts <<-EOF
Hello,
Ruby
EOF
このコードでは、Hello, と Ruby の前にある6つのスペースがそのまま文字列に含まれる
ポイント② 終端の EOF はインデント可能だが文字列には含まれない
<<-EOF を使うと、終端の EOF をインデントして書くことが可能
しかし、この EOF 自体は文字列には含まれない
実際に得られる文字列
上記のコードを実行すると、得られる文字列は以下
" Hello,\n Ruby\n"
行頭の6つのスペースがそのまま保持され、インデント分の空白が文字列に含まれている
選択肢の検証
例えば
| 選択肢 | 結果 | 判定 |
|---|---|---|
"Hello,\nRuby\n" |
スペースが消えている | × |
"Hello,\nRuby\nEOF" |
EOF が文字列に含まれている | × |
" Hello,\n Ruby\n" |
行頭のスペースが含まれている | 🙆 |
| エラーが発生する |
<<-EOF は正しく動作する |
× |
通常のヒアドキュメント <<EOF との違い
比較のために、通常のヒアドキュメントとの違い
# 通常のヒアドキュメント
puts <<EOF
Hello,
Ruby
EOF
# 終端のEOFはインデントできない(行頭に書く必要がある)
# インデント付きヒアドキュメント
puts <<-EOF
Hello,
Ruby
EOF
# 終端のEOFをインデントできる
どちらも行頭のスペースは文字列に含まれる。
<<-EOF は終端をインデントして書けるから、コードの見た目が整う。
スペースを含めたくない場合
もし行頭のスペースを文字列に含めたくない場合は、Ruby2.3以降で導入された スクイーズ演算子~を使用するのもいいらしい。
puts <<~EOF
Hello,
Ruby
EOF
この場合、出力は以下
"Hello,\nRuby\n"
行頭のスペースが自動的に削除される。
まとめ
-
<<-EOFはインデント付きヒアドキュメント -
- 行頭のスペースは文字列に含まれる
- 終端の
EOFはインデント可能だが、文字列には含まれない - スペースを削除したい場合は
<<~EOFを使う