概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Idiosyncratic Ruby: Big Data Without End
- 原文公開日: 2017/12/25
- 著者: Jan Lelis
- サイト: Idiosyncratic Ruby
タイトルは内容に即したものにしました。
Ruby: 巨大ヒアドキュメントをDATA
定数と__END__
で扱う(翻訳)
Rubyの巨大なDATA
定数には知られざる機能が隠れています。
行の先頭に__END__
キーワードを書くと、それより下に書いたものはすべてRubyによってまったく解釈されなくなりますが、巨大な1DATA
定数2を用いれば取り出せます。以下はサンプルのbig-data.rb
スクリプトです。
p DATA.read
__END__
big data
巨大なDATA
はFileオブジェクトであり、read
できます。上のサンプルでは"big data"
と出力されます。現実に有用な例としては、Sinatra webフレームワークのインラインテンプレートがあります3。
訳注: 本記事のサンプルコードはirbやpryでは実行できません。
このDataセクションは使えるか?
ちょっと待ってください。巨大なDATA
がFileオブジェクトというのは、具体的にはどのファイルのことでしょうか?
p DATA.path
p DATA.lineno
__END__
big data
上の出力結果は"big-data.rb"
と3
です。この巨大なDATA
オブジェクトは、実はこのソースファイルの特定の位置を指しているのです!つまり次のようなこともできます。
DATA.rewind
puts DATA.gets("\n__END__")[0..-9]
__END__
big data
上のコードはソースコード自身を読み出し、以下を出力します。
DATA.rewind
puts DATA.gets("\n__END__")[0..-9]
参考
関連記事
-
小文字を含む
Data
クラスとは異なります(CRubyでの実装の詳細)(訳注:Data
クラスはRuby 2.5.1でdeprecatedとなっています)。 ↩ -
巨大な
DATA
定数は、__END__
を記述しなければ定義されません。さらに、上のスクリプトを直接実行するのではなく読み込んだりrequire
した場合は利用できません。 ↩ - 実際にはそうでもないようです。 ↩