はじめに
今回はヒアドキュメントに関する内容です。ヒアドキュメントの識別子としてEOFがあり、EOFの前につける文字に応じてEOFの挙動が変わることは理解していました。しかし、具体的にどのように変わるのかが自分の中で整理できていなかったため、調査しまとめてみます。
EOFの種類
ruby gold試験に+EOF、-EOF、~EOFが出題されていたのですが、+EOFは存在しなさそうなので、EOF、-EOF、~EOFの動きを確認していきます。(試験では存在しないものも出題されるのでひっかけ問題に要注意です...)
確認してみた
環境はruby2.5.3です。
まず、EOFを利用した下記コードを実行しました。
s = <<EOF
Hello,
Ruby
EOF
puts s
irb(main):001:0> s = <<EOF
irb(main):002:0" Hello,
irb(main):003:0" Ruby
irb(main):004:0" EOF
irb(main):005:0" puts s
irb(main):006:0"
irb(main):007:0"
irb(main):008:0"
irb(main):009:0"
すると、処理が実行されませんでした。
調査してみると、どうやら2個目のEOFをインデントすることはできないみたいです。
そのため、2個目のEOFをインデントしないバージョンで実行しました。
s = <<EOF
Hello,
Ruby
EOF
puts s
irb(main):001:0> s = <<EOF
irb(main):002:0" Hello,
irb(main):003:0" Ruby
irb(main):004:0" EOF
=> " Hello,\n Ruby\n"
irb(main):005:0> puts s
Hello,
Ruby
=> nil
すると、今度はsにはテキストが格納され、putsでテキストを表示できています。
sに格納されたテキストには空白が含まれています。
次に、~EOFを利用した下記コードを実行しました。
s = <<~EOF
Hello,
Ruby
EOF
puts s
irb(main):001:0> s = <<~EOF
irb(main):002:0" Hello,
irb(main):003:0" Ruby
irb(main):004:0" EOF
=> "Hello,\nRuby\n"
irb(main):005:0> puts s
Hello,
Ruby
=> nil
すると、sに格納されたテキストには空白が含まれていません。
最後に、-EOFを利用した下記コードを実行しました。
s = <<-EOF
Hello,
Ruby
EOF
puts s
irb(main):001:0> s = <<-EOF
irb(main):002:0" Hello,
irb(main):003:0" Ruby
irb(main):004:0" EOF
=> " Hello,\n Ruby\n"
irb(main):005:0> puts s
Hello,
Ruby
=> nil
すると、sに格納されたテキストには空白が含まれています。
おわりに
確認した結果、EOFと-EOFともに空白を含めてテキストを格納できることと、~EOFのみ空白を含めずにテキストを格納できることが分かりました。EOFに関しては、2個目のEOFをインデントすることはできないことも分かりました。今回比較しながら何が違うのか整理し納得できたので非常に良かったです!もし誤っている箇所がありましたらご指摘いただけると助かります!
参考