试图理解Innate的一段代码

时间:2009-09-13 01:17:04

标签: ruby

请考虑Innate中的以下背景:

# Default application for Innate
def innate(app = Innate::DynaMap, options = Innate.options)
  roots, publics = options[:roots], options[:publics]

  joined = roots.map{|root| publics.map{|public| ::File.join(root, public)}}

  apps = joined.flatten.map{|pr| Rack::File.new(pr) }
  apps << Current.new(Route.new(app), Rewrite.new(app))

  cascade(*apps)
end

我的第一个问题与上面的以下行有关:

  joined = roots.map{|root| publics.map{|public| ::File.join(root, public)}}

这条线在做什么?

1 - 我的猜测是它需要一个文件名并将其添加到一个数组caled publics然后将其包装在另一个名为roots的数组中。这是正确的吗?

我的第二个问题与此有关:

  apps = joined.flatten.map{|pr| Rack::File.new(pr) }
  apps << Current.new(Route.new(app), Rewrite.new(app))

2 - 这里“扁平化”的目的是什么?

1 个答案:

答案 0 :(得分:2)

看起来它需要一个名为roots的数组(或类似数组)的东西,并且对于它的每个元素,它都会对publics的每个元素进行处理:

因此,如果roots["/a", "/b"]且公开为["alpha", "beta", "gamma"],则会:

[["/a/alpha", "/a/beta", "/a/gamma"], ["/b/alpha", "/b/beta", "/b/gamma"]]

现在我们可以看到为什么需要压扁它。 Flatten将组件数组拉入一个数组。所以,joined.flatten会:

["/a/alpha", "/a/beta", "/a/gamma", "/b/alpha", "/b/beta", "/b/gamma"]