【发布时间】:2011-11-29 16:04:44
【问题描述】:
这是我之前关于 Sinatra 处理路由方法的问题的一个更集中的版本。
根据我对源代码的理解,Sinatra 采用路由中的方法块,并传递一个包含相同主体的新方法,即:
get "some/url" do
return "Hello World" # this gets taken out
end
所以在这个例子中,方法体似乎被复制到一个新方法中,该方法应用于 Sinatra 对象。我只是想知道为什么会发生这种情况,我尝试上他们的 IRC 频道但没有人在那里,而且邮件列表也不那么忙。
我在他们的框架中谈论的主要源代码在 base.rb 中,大约在第 1180 行:
def generate_method(method_name, &block)
define_method(method_name, &block)
method = instance_method method_name
remove_method method_name
method
end
那么他们这样做有什么具体原因,而不仅仅是引用方法本身?
我问这个问题的原因是因为 Sinatra 目前处理这个问题的方式使得不可能有一个拥有自身之外的知识的方法,并且通过只采用一个没有上下文的方法来破坏类封装。
【问题讨论】: