BLOGTIMES
2012/08/05

ERB と binding

  ruby 
このエントリーをはてなブックマークに追加

先日のFE覚醒誕生日カレンダーは下記のような簡単な Ruby スクリプトを使って、リストから .ics ファイルを生成し、そのファイルを Google カレンダーにインポートしました。

こういう定型的なテキスト出力を伴う処理を大量に行うときは ERB*1 のようなテンプレートエンジンが大活躍です。ERB を使うのは久しぶりだったのですが、この binding が何者なのかというのは前々からちょっと気になっていました。ERB#result は binding がなくても呼び出せますが、それだとうまく変数が参照できないので、一種のおまじないだと思っていました。

puts @erb.result(binding)

特にスクリプト中で binding という変数は作っていないので、これが何なのか irb で調べてみます。Binding*2というクラスのオブジェクトでした。

$ irb irb(main):001:0> binding => #<Binding:0xb7f0c690> irb(main):002:0>

マニュアルを読み進めてみると、この binding というのは Kernel#bindingModule: Kernel (Ruby 1.9.3) を呼び出して Binding オブジェクトを取得していたようです。Binding オブジェクトは「ローカル変数のテーブルと self、モジュールのネストなどの情報を保 持するオブジェクト」ということになっているので、erb はこれを使って result が呼ばれた時の変数にアクセスするという仕組みになっていたのですね。

ics ファイルの生成に使ったスクリプト

tsv2ics.rb

require 'rubygems' require 'fastercsv' require 'erb' require 'digest/md5' @erb = ERB.new('BEGIN:VEVENT UID:<%= Digest::MD5.new.update(row[0]) %>@sailane.cles.net DTSTAMP:20120723T141235Z SUMMARY:<%= row[1] %> CLASS:PUBLIC DTSTART;VALUE=DATE:<%= row[0] %> TRANSP:TRANSPARENT RRULE:FREQ=YEARLY END:VEVENT ') puts <<EOH BEGIN:VCALENDAR PRODID:-//Google Inc//Google Calendar 70.9054//EN VERSION:2.0 CALSCALE:GREGORIAN METHOD:PUBLISH X-WR-CALNAME:覚醒キャラ誕生日 X-WR-TIMEZONE:Asia/Tokyo X-WR-CALDESC:FE覚醒登場キャラクターの誕生日です BEGIN:VTIMEZONE TZID:Asia/Tokyo X-LIC-LOCATION:Asia/Tokyo BEGIN:STANDARD TZOFFSETFROM:+0900 TZOFFSETTO:+0900 TZNAME:JST DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE EOH FasterCSV.foreach("list.txt", :col_sep=>"\t", :headers=>%w(date summary), :return_headers=>false) do |row| puts @erb.result(binding) end puts <<EOF END:VCALENDAR EOF

list.txt

20120402 サーリャ の誕生日 20120414 マリアベル の誕生日 20120420 ルキナ の誕生日 20120425 ロラン の誕生日 20120505 マークの誕生日 20120514 シンシア の誕生日 ・・・・・・

参考

 ・ERBの実行時に出てくるbindingって何者?:お題目うぉっち


トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/5140
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン