0
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初学者】Rubyのインデント付きヒアドキュメント `<<-EOF` の動作を理解する

Posted at

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を使う
0
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
0
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?