我看到Railscast#151。在此视频中,展示了Rack的代码段。它对应于Rack::Builder
模块。我在to_app
方法中遗漏了一些内容:
def to_app
app = @map ? generate_map(@run, @map) : @run
fail "missing run or map statement" unless app
@use.reverse.inject(app) { |a,e| e[a] }
end
有人可以解释该方法的最后一行及其实际作用吗?我知道inject
使用累加器变量和元素变量。但我不明白为什么我们可以使用e[a]
进行数组订阅。
答案 0 :(得分:2)
在这种情况下,[]
不是数组访问权限。这是调用lambda或proc的一种方法,相当于e.call(a)
。 (参见documentation。)如果查看use
method,@use
变量是一组lambdas。此代码以相反的顺序运行每个中间件(和/或映射),并以app作为参数调用每个lambda。这就是他们如何逐步构建app。