Amo*_*ari 16 ruby rack ruby-on-rails rack-middleware
最近我碰巧在Ruby代码中看到这个词use,当我正在浏览一些与goliath,middleware等相关的代码时.看起来它与include/ extend,和require.
有人可以解释为什么这个use关键字存在,以及它与include/有require什么不同?它是如何工作的,什么时候使用它?
小智 27
正如人们所指出的,use不是Ruby关键字,它实际上是Rack::Builder类的一个方法:
use(middleware, *args, &block)指定要在堆栈中使用的中间件.
该文档(由@ user166390指出)描述如下:
Rack::Builder实现一个小型DSL来迭代地构建Rack应用程序.例:
Run Code Online (Sandbox Code Playgroud)app = Rack::Builder.new { use Rack::CommonLogger use Rack::ShowExceptions map "/lobster" do use Rack::Lint run Rack::Lobster.new end }要么
Run Code Online (Sandbox Code Playgroud)app = Rack::Builder.app do use Rack::CommonLogger lambda { |env| [200, {'Content-Type' => 'text/plain'}, 'OK'] } end
use将中间件添加到堆栈,run调度到应用程序.
我对Rack::Builder源代码不太熟悉,但看起来每次use使用新的中间件模块调用时,它都会被添加到一个数组中,并且每个模块都按照添加它的相反顺序运行/注入(最后一个)先进先出顺序,又称堆叠顺序).运行以前的中间件的结果通过以下方式传递到堆栈中的下一个中间件inject:
def initialize(default_app = nil,&block)
# @use is parallel assigned to [].
@use, @map, @run = [], nil, default_app
instance_eval(&block) if block_given?
end
Run Code Online (Sandbox Code Playgroud)def use(middleware, *args, &block)
if @map
mapping, @map = @map, nil
@use << proc { |app| generate_map app, mapping }
end
# The new middleware is added to the @use array.
@use << proc { |app| middleware.new(app, *args, &block) }
end
Run Code Online (Sandbox Code Playgroud)def to_app
app = @map ? generate_map(@run, @map) : @run
fail "missing run or map statement" unless app
# The middlewares are injected in reverse order.
@use.reverse.inject(app) { |a,e| e[a] }
end
Run Code Online (Sandbox Code Playgroud)