Saturday, August 15, 2009

Sinatraの仕組み2

  1. get '/' do "hello" endは引数およびブロックを伴うRubyのメソッド呼び出しである
  2. それなら対応するメソッド定義があるはずだ=>base.rbの中のBaseクラスにクラスメソッドとしてある
  3. よってBaseクラスオブジェクトに対してBase.getとしてこのメソッドを呼べるが、Sinatraではトップレベルでこれを呼んでいる
  4. つまりトップレベルがBaseクラスのコンテキストにない限りそこでこれをよぶことはできない
  5. Sinatraはこの問題を解決するためにメソッドの委譲を使っている

#!/opt/local/bin/ruby
require "rubygems"
require "sinatra/base"

def get(*args, &b)
  Sinatra::Base.send(:get, *args, &b)
end

get('/'){ "hello" }


at_exit do
  ::Sinatra::Base.run!
end

No comments: