- blogs:
- cles::blog
2012/08/05

ERB と binding

先日の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 を使ってログインすることができます。
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . アーロンチェアのポスチャーフィットを修理(114203)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(112758)
3 . 年次の人間ドックへ(112212)
4 . 2023 年分の確定申告完了!(1つめ)(111777)
5 . 三菱鉛筆がラミーを買収(111656)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(112758)
3 . 年次の人間ドックへ(112212)
4 . 2023 年分の確定申告完了!(1つめ)(111777)
5 . 三菱鉛筆がラミーを買収(111656)
cles::blogについて
Referrers