rackを読む#1

Rubyist九州で話題に上がったrackを読みました。
感想としてすごくシンプルで機能が限定してあり、読みやすかったです。
本当に綺麗なコードでした。
Christian Neukirchen is Code artist.
DHH is Black magic master.

Rackとは

WebサーバとWebアプリケーションの間に一枚挟まるシンプルな変換アダプターです。
mongrelWEBrickなどのAPIの差異を、rackをはさむ事で統一し、
簡単にWebサーバを切り替えられるようになります。
Rack: a Ruby Webserver Interface
 

rack.rb

初めにrack.rb

module Rack
  VERSION = [0,1]

  def self.version
    VERSION.join(".")
  end

  autoload :Builder, "rack/builder"
  autoload :CommonLogger, "rack/commonlogger"
  autoload :File, "rack/file"
  autoload :ForwardRequest, "rack/recursive"
  autoload :Lint, "rack/lint"
  autoload :Recursive, "rack/recursive"
  autoload :Reloader, "rack/reloader"
  autoload :ShowExceptions, "rack/showexceptions"
  autoload :URLMap, "rack/urlmap"
  autoload :Utils, "rack/utils"

  autoload :MockRequest, "rack/mock"
  autoload :MockResponse, "rack/mock"

  autoload :Request, "rack/request"
  autoload :Response, "rack/response"

  module Adapter
    autoload :Camping, "rack/adapter/camping"
    autoload :Rails, "rack/adapter/rails"
  end

  module Handler
    autoload :CGI, "rack/handler/cgi"
    autoload :FastCGI, "rack/handler/fastcgi"
    autoload :Mongrel, "rack/handler/mongrel"
    autoload :WEBrick, "rack/handler/webrick"
  end
end

すごくシンプルで、すぐディレクトリ構造や役割が想像できます。
ここで特記しておきたいのは「autoload」です。
 

組み込み関数 autoload

autoloadの動きは以下のとおりです。

autoload(const_name, feature)
autoload?(const_name) (ruby 1.8 feature)
定数 const_name を最初に参照した時に feature を require するように設定します。
const_name は文字列または Symbol で指定します。
なお、const_name には、"::" 演算子を含めることはできません
 (つまり、トップレベルの定数しか指定できません)。

ということは

Rack::Request.new

とした時に初めてrequireされる事になり、無駄な部分requireせず非常に効率的です。
また、 module内にクラスをべた書きせず別ファイルに書いている事で、
非常にすっきりし、コード自体が読みやすくなります。
 

次回は

rackのコマンド部分を追ってみたいと思います。
 

といいながら

書かなかったことが多々あるので、期待はしないほうが。。。