最近我偶然在Ruby代码中看到这个词,use
,当我正在查看一些与goliath https://github.com/postrank-labs/goliath,中间件等。看起来它不同于include
/extend
, and require
.
有人可以解释为什么这样吗use
关键字是否存在,以及它与include
/require
?它是如何工作的,何时使用它?
文档
正如人们指出的那样,use
不是 Ruby 关键字,它实际上是Rack::Builder class http://rack.rubyforge.org/doc/Rack/Builder.html#method-i-use:
use(middleware, *args, &block)
指定要在堆栈中使用的中间件。
本文档 http://rack.rubyforge.org/doc/classes/Rack/Builder.html (@user166390 指出 https://stackoverflow.com/questions/11982310/use-keyword-word-in-ruby-code/22245277#comment15976209_11982310)这样描述:
Rack::Builder
实现一个小型 DSL 来迭代构建Rack
应用程序。
Example:
app = Rack::Builder.new {
use Rack::CommonLogger
use Rack::ShowExceptions
map "/lobster" do
use Rack::Lint
run Rack::Lobster.new
end
}
Or
app = Rack::Builder.app do
use Rack::CommonLogger
lambda { |env| [200, {'Content-Type' => 'text/plain'}, 'OK'] }
end
use
将中间件添加到堆栈中,run
分派到应用程序。
源代码
我对这个不太熟悉Rack::Builder源代码 https://github.com/rack/rack/blob/1.5.2/lib/rack/builder.rb,但看起来每次你打电话use
使用新的中间件模块,它被添加到一个数组中,并且每个模块都以与添加它相反的顺序运行/注入(后进先出顺序,又称堆栈顺序)。运行前一个中间件的结果通过以下方式传递给堆栈中的下一个中间件inject http://ruby-doc.org/core-2.1.1/Enumerable.html#method-i-inject:
-
第 53-56 行 https://github.com/rack/rack/blob/1.5.2/lib/rack/builder.rb#L53-L56:
def initialize(default_app = nil,&block)
# @use is parallel assigned to [].
@use, @map, @run = [], nil, default_app
instance_eval(&block) if block_given?
end
-
第 81-87 行 https://github.com/rack/rack/blob/1.5.2/lib/rack/builder.rb#L81-L87:
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
-
第 131-135 行 https://github.com/rack/rack/blob/1.5.2/lib/rack/builder.rb#L131-L135:
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
其他资源
-
机架快速简介 http://rubylearning.com/blog/a-quick-introduction-to-rack/#C16.
-
Ruby on Rack #2 - 构建器 http://m.onkey.org/ruby-on-rack-2-the-builder.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)