加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 为什么Sinatra会复制路径的方法块?

发布时间:2020-12-17 02:42:40 所属栏目:百科 来源:网络整理
导读:这是围绕Sinatra处理路线方法的前一个问题的一个更集中的版本. 根据我对源代码的理解,Sinatra在路由中获取方法块,并传递一个包含相同主体的新方法,即: get "some/url" do return "Hello World" # this gets taken outend 所以在这个例子中,方法体似乎被复制
这是围绕Sinatra处理路线方法的前一个问题的一个更集中的版本.

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

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

所以在这个例子中,方法体似乎被复制到一个应用于Sinatra对象的新方法中.我只是想知道为什么会发生这种情况,我尝试了他们的IRC频道,但没有人在那里,邮件列表并不那么繁忙.

我在他们的框架中讨论的主要代码是在1180行的base.rb中:

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 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读