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

概要

原著者の許諾を得て翻訳・公開いたします。

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

Rubyの巨大なDATA定数には知られざる機能が隠れています。

行の先頭に__END__キーワードを書くと、それより下に書いたものはすべてRubyによってまったく解釈されなくなりますが、巨大な1DATA定数2を用いれば取り出せます。以下はサンプルのbig-data.rbスクリプトです。

p DATA.read
__END__
big data

巨大なDATAFileオブジェクトであり、readできます。上のサンプルでは"big data"と出力されます。現実に有用な例としては、Sinatra webフレームワークのインラインテンプレートがあります3

訳注: 本記事のサンプルコードはirbやpryでは実行できません。

このDataセクションは使えるか?

ちょっと待ってください。巨大なDATAFileオブジェクトというのは、具体的にはどのファイルのことでしょうか?

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: 私たち、もしかしてat_exit?を使いすぎ?(翻訳)

Railsらしく書こう


  1. 小文字を含むDataクラスとは異なります(CRubyでの実装の詳細)(訳注: DataクラスはRuby 2.5.1でdeprecatedとなっています)。 
  2. 巨大なDATA定数は、__END__を記述しなければ定義されません。さらに、上のスクリプトを直接実行するのではなく読み込んだりrequireした場合は利用できません。 
  3.  実際にはそうでもないようです。 
デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ