Just do IT

思うは招く

Ruby の __END__ と DATA とは

結論

  • Ruby__END__と書くと、それ以降のコードはプログラムではなくデータとして読み込まれる
  • そのデータは、DATA という定数を使ってアクセスできる
  • __END__と DATA はセットで使われることが多い

例1

puts DATA

__END__
いいハンターってやつは、動物に好かれちまうんだ。

__END__のあとの某マンガの有名なセリフを、DATAが受け取る。puts で表示すると、つぎのように表示される。

$ ruby end.rb 
#<File:0x00007fb7fe141078>

ファイルオブジェクトが表示されている。某マンガの有名なセリフを取得したい場合は、getsメソッドを使う。

puts DATA.gets

__END__
いいハンターってやつは、動物に好かれちまうんだ。

結果

$ ruby end.rb 
いいハンターってやつは、動物に好かれちまうんだ。

文字列を取得できた。

例2

次に、ループで表示してみる。

DATA.each do |line|
  puts line
end

__END__
この年で挑戦者か。血沸く血沸く♪
おそろしく速い手刀。オレでなきゃ見逃しちゃうね。
そりゃ悪手だろ。蟻んコ

例のごとく、某マンガの有名なセリフたちが並んでいる。これをeachメソッドでputsしていくと・・・

$ ruby end.rb 
この年で挑戦者か。血沸く血沸く♪
おそろしく速い手刀。オレでなきゃ見逃しちゃうね。
そりゃ悪手だろ。蟻んコ

セリフたちが表示される。

ちなみに、データなので改行も取得する。

DATA.each do |line|
  puts line
end

__END__
この年で挑戦者か。血沸く血沸く♪

おそろしく速い手刀。オレでなきゃ見逃しちゃうね。

そりゃ悪手だろ。蟻んコ

改行されている↓

$ ruby end.rb 
この年で挑戦者か。血沸く血沸く♪

おそろしく速い手刀。オレでなきゃ見逃しちゃうね。

そりゃ悪手だろ。蟻んコ