DATA -> File
[permalink][rdoc][edit]-
スクリプトの __END__ プログラムの終り以降をアクセスする File オブジェクト。
ソースファイルの __END__ 以降は解析・実行の対象にならないのでその部分にプログラムが利用するためのデータを書き込んでおくことができます。 DATA 定数はそのデータ部分にアクセスするための File オブジェクトを保持しています。
__END__ を含まないプログラムにおいては DATA は定義されません。
注意
- DATA.rewind で移動する読みとり位置は __END__ 直後ではなく、 スクリプトファイルの先頭です。
- スクリプトが標準入力から読みこまれた場合は標準入力になります。
- スクリプトがファイルや標準入力から読みこまれなかった場合や、 __END__ で終っていない場合には定義されません。
- Kernel.#require や Kernel.#load で 読み込まれたファイルの中であってもそのファイル (__FILE__, 変数と定数/疑似変数) ではなく実行されたファイル ($0) を指します。
例1
print DATA.gets # => 故人西辞黄鶴楼 print DATA.gets # => 烟花三月下揚州 print DATA.gets # => 孤帆遠影碧空尽 print DATA.gets # => 唯見長江天際流 DATA.gets # => nil __END__ 故人西辞黄鶴楼 烟花三月下揚州 孤帆遠影碧空尽 唯見長江天際流
例2
sum = 0 DATA.each_line do |line| sum += line.to_i end DATA.rewind p DATA.gets # => "sum = 0¥n" __END__ 17 19 23 29 31
例3
DATA.gets # => uninitialized constant DATA (NameError)
例4
ファイル library.rb と app.rb の内容が以下であったとします。
library.rb:
print DATA.gets __END__ data from library
app.rb:
require 'library.rb' __END__ data from app
このときシェルから次を実行すると
$ ruby app.rb
結果は以下のように出力されます。
data from app