你没有很好地寻找源代码:) #get方法定义下面10行有一个route私有方法的定义:
# lib/sinatra/base.rb, line 1212
private
def route(verb, path, options={}, &block)
# Because of self.options.host
host_name(options.delete(:host)) if options.key?(:host)
enable :empty_path_info if path == "" and empty_path_info.nil?
signature = compile!(verb, path, block, options)
(@routes[verb] ||= []) << signature
invoke_hook(:route_added, verb, path, block)
signature
end
这是一个私有方法,您不会在 Sinatra 文档中找到它。
这个方法通常做以下事情:它从传递的&block创建proc,将它与http路径、键和调用条件(在compile!方法内部)结合起来,并将其存储在@routes[verb]类实例变量中,这样块就可以通过路径和条件找到并稍后执行(该类还定义了attr_reader :routes,以便其他类可以访问其@routes 实例变量)。
稍后,当您收到与此路由匹配的 http 请求(Base 类的@request 实例变量)时,该块在 Base#route! 方法内执行(参见第 795 行)。
我建议您使用一些有助于检查源代码的 IDE。例如,我为此使用Rubymine 及其功能Go To -> Declaration:只需将光标放在变量/方法/类/等上,按 F12,Rubymine 就会为您找到它,即使在连接的 gem 的源代码中也是如此。