DATA constant does more than you might expect!
Everything after the
__END__ keyword (at the beginning of the line) is not interpreted as Ruby, but can be retrieved with the big¹
DATA constant.² This is an example
p DATA.read __END__ big data
DATA is a File object, which you can
read. The example will output
"big data". An example of real-world usage is inline templating within the sinatra web framework.³
¹ Do not confuse with the small
Data class, which is a CRuby implementation detail
DATA is not defined, if you have no
__END__. Furthermore, it is not available if you did not execute the script directly, but loaded or requierd it.
³ Actually, not really
Is the Data Section Enough?
Wait a minute! Big
DATA is a File object? What file exactly?
p DATA.path p DATA.lineno __END__ big data
The output will be
3. The big
DATA object points to the source file itself at a specific position! And look, we can alter this:
DATA.rewind puts DATA.gets("\n__END__")[0..-9] __END__ big data
It will now read the source code of itself:
DATA.rewind puts DATA.gets("\n__END__")[0..-9]