gpt4 book ai didi

ruby - 为什么 Sinatra 会复制路由的方法 block ?

转载 作者:数据小太阳 更新时间:2023-10-29 07:27:29 25 4
gpt4 key购买 nike

这是我之前关于 Sinatra 对路由方法的处理的问题的一个更集中的版本。

根据我对源代码的理解,Sinatra 在路由中获取方法 block ,并传递一个包含相同主体的新方法,即:

get "some/url" do 
return "Hello World" # this gets taken out
end

所以在这个例子中,方法主体似乎被复制到一个新方法中,该方法应用于 Sinatra 对象。我只是想知道为什么会这样,我尝试访问他们的 IRC channel ,但那里没有人,而且邮件列表也不是很忙。

我在他们的框架中谈论的大部分源代码都在 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 目前处理这个问题的方式使得不可能有一个方法拥有自身之外的知识,并且通过仅采用没有上下文的单一方法来破坏类封装。

最佳答案

正如上面的评论,这会生成一个方法。一个适当的方法。如果 Sinatra 不会在 generate_method 中再次删除该方法,您实际上可以通过执行类似 send("GET some/url") 的操作来调用它。问题是,为什么Sinatra又把这个方法去掉了呢?很简单,每个路由可能有多个处理程序:

get 'some/route' do
pass if request.referrer == '/foo'
"didn't come from /foo"
end

get 'some/route' do
"did come from /foo"
end

两种方法具有相同的名称。

关于您对子类和方法的评论,这应该有效:

class MyApp < Sinatra::Base
def content
return "did come from /foo" if request.referrer == '/foo'
"didn't come from /foo"
end

get('some/route') { content }
end

或者,在做经典应用时:

helper do
def content
return "did come from /foo" if request.referrer == '/foo'
"didn't come from /foo"
end
end

get('some/route') { content }

关于ruby - 为什么 Sinatra 会复制路由的方法 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8313885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com