5
0

【Ruby Gold3.1詰まったシリーズ】ヒアドキュメント確認してみた

Last updated at Posted at 2023-12-23

はじめに

今回はヒアドキュメントに関する内容です。ヒアドキュメントの識別子としてEOFがあり、EOFの前につける文字に応じてEOFの挙動が変わることは理解していました。しかし、具体的にどのように変わるのかが自分の中で整理できていなかったため、調査しまとめてみます。

EOFの種類

ruby gold試験に+EOF、-EOF、~EOFが出題されていたのですが、+EOFは存在しなさそうなので、EOF、-EOF、~EOFの動きを確認していきます。(試験では存在しないものも出題されるのでひっかけ問題に要注意です...)

確認してみた

環境はruby2.5.3です。
まず、EOFを利用した下記コードを実行しました。

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をインデントしないバージョンで実行しました。

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を利用した下記コードを実行しました。

~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を利用した下記コードを実行しました。

-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をインデントすることはできないことも分かりました。今回比較しながら何が違うのか整理し納得できたので非常に良かったです!もし誤っている箇所がありましたらご指摘いただけると助かります!

参考

5
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
5
0