sinatraはset :foo, 'bar'
みたいなDSLを使って値を設定できる。でもこの値ってどこにどうやって保存されているんだろう?
普通、最終的にはインスタンス変数かクラス変数に格納されてるって思うよね。
(class << self; self; end).class_eval do
undef_method(name) if method_defined? name
String === content ? class_eval("def #{name}() #{content}; end") : define_method(name, &content)
end
sinatra/lib/sinatra/base.rb at v1.4.5 · sinatra/sinatra
ところがset :foo, 'bar'
するとbar
を返すfooというメソッドが定義されるという形で保存されている。
set
するたびにundef_method
して定義し直すので変数みたいに使えるようだ。静的な頭で考えてたのでクラクラするような格納方法だ。