gpt4 book ai didi

ruby - Sinatra 是如何定义和调用 get 方法的?

转载 作者:数据小太阳 更新时间:2023-10-29 06:58:37 24 4
gpt4 key购买 nike

我很好奇这东西是如何工作的。

在要求 'sinatra' 之后

然后我可以在顶级范围内调用 get()。

深入源码后,我发现了这个get()结构

module Sinatra
class << self
def get
...
end
end
end

知道类 << self 是打开 self 对象的单例类定义并在里面添加 get() ,所以它开始有意义。

但我唯一想不通的是它在模块 Sinstra 中,如何在不使用 Sinatra::解析操作或其他东西的情况下调用 get()?

最佳答案

它分散在几个地方,但是如果您查看 lib/sinatra/main.rb,您可以在底部看到这一行:包含 Sinatra::Delegator

如果我们进入 lib/sinatra/base.rb,我们会看到这段代码大约在 1470 左右。

  # Sinatra delegation mixin. Mixing this module into an object causes all
# methods to be delegated to the Sinatra::Application class. Used primarily
# at the top-level.
module Delegator #:nodoc:
def self.delegate(*methods)
methods.each do |method_name|
define_method(method_name) do |*args, &block|
return super(*args, &block) if respond_to? method_name
Delegator.target.send(method_name, *args, &block)
end
private method_name
end
end

delegate :get, :patch, :put, :post, :delete, :head, :options, :template, :layout,
:before, :after, :error, :not_found, :configure, :set, :mime_type,
:enable, :disable, :use, :development?, :test?, :production?,
:helpers, :settings
class << self
attr_accessor :target
end

self.target = Application
end

这段代码的作用与评论所说的相同:如果包含它,它会将对委托(delegate)方法列表的所有调用委托(delegate)给 Sinatra::Application 类,该类是 Sinatra 的子类: :Base,这是定义get方法的地方。当你写这样的东西时:

require "sinatra"

get "foo" do
"Hello World"
end

由于之前设置的委托(delegate),Sinatra 最终将调用 Sinatra::Base 上的 get 方法。

关于ruby - Sinatra 是如何定义和调用 get 方法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6624136/

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