現在リリースされていて、普通に gem install で入る Sinatra (version <= 1.3.2) は、じつは require 'sinatra' するとあらゆるオブジェクトに get/post/put/delete をはじめとした Sinatra DSL が定義されてしまう。なので、
1 2 3 4 5 6 7 | require 'sinatra' class << "" get '/' do "hello" end end |
こんなコードを書いても、
1 2 3 4 5 | $ ruby get-string.rb [2012-05-06 16:46:35] INFO WEBrick 1.3.1 [2012-05-06 16:46:35] INFO ruby 1.9.3 (2012-02-16) [x86_64-darwin11.3.0] == Sinatra/1.3.2 has taken the stage on 4567 for development with backup from WEBrick [2012-05-06 16:46:35] INFO WEBrick::HTTPServer#start: pid=24113 port=4567 |
サーバが立ち上がってしまう。 http://localhost:4567 を見に行くと「hello」って出る。ヤバい。
この挙動ではあまりにもアレすぎるので、最新の Sinatra では、(添付されているテストが奇怪でびっくりする)このコミットから
28 29 30 | # include would include the module in Object # extend only extends the `main` object extend Sinatra::Delegator |
extend することで、トップレベルに存在するオブジェクトである main (irbでトップレベルで「self」と打ち込むと取得できるアレだ)の特異メソッドとしてのみ、 Sinatra DSL を定義するようになっている。
この挙動は、Ruby WAF 勉強会に参加して気づいた。 Thanks @ainame !
* * *
なので、上記記事で紹介されている Object.private_instance_methods で get とかが出てくる挙動は、Edgeとか、次のバージョンであろう 1.3.3 では再現しませんね〜






