Пытаясь понять кусок кода от Innate - PullRequest
1 голос
/ 13 сентября 2009

Пожалуйста, примите во внимание следующий контекст из 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 - Я предполагаю, что оно берет имя файла и добавляет его в публичный массив, а затем помещает его в другой массив, называемый root Это правильно?

Мой второй вопрос связан с этим:

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

2 - Какова цель «сплющивания» здесь?

1 Ответ

2 голосов
/ 13 сентября 2009

Похоже, что он принимает массив (или похожий на массив) объект, называемый roots, и для каждого его элемента он привязывает каждый элемент publics:

Так что если бы roots было ["/a", "/b"], а publics было ["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"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...