3

我看到了 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].

4

1 回答 1

3

在这种情况下,[]不是数组访问。这是调用 lambda 或 proc 的一种方式,相当于e.call(a). (请参阅文档。)如果您查看use方法,则该@use变量是一个 lambda 数组。此代码以相反的顺序通过每个中间件(和/或映射)运行,并以应用程序作为参数调用每个 lambda。这就是他们一点一点地构建应用程序的方式。

于 2013-05-06T08:46:55.727 回答