Ruby: 終わりのない巨大な`DATA`定数(翻訳)

概要 原著者の許諾を得て翻訳・公開いたします。 英語記事: Idiosyncratic Ruby: Big Data Without End 原文公開日: 2017/12/25 著者: Jan Lelis サイト: Idiosyncratic Ruby Ruby: 終わりのない巨大なDATA定数(翻訳) 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] 参考 $ ruby -x SCRIPT_LINES__ 関連記事 Ruby: 私たち、もしかしてat_exit?を使いすぎ?(翻訳) Railsらしく書こう 小文字を含むDataクラスとは異なります(CRubyでの実装の詳細)(訳注: DataクラスはRuby 2.5.1でdeprecatedとなっています)。 ↩ 巨大なDATA定数は、__END__を記述しなければ定義されません。さらに、上のスクリプトを直接実行するのではなく読み込んだりrequireした場合は利用できません。 ↩  実際にはそうでもないようです。 ↩