Я хотел бы понять, как работает следующий код:
def url
@url ||= {
"basename" => self.basename,
"output_ext" => self.output_ext,
}.inject("/:basename/") { |result, token|
result.gsub(/:#{token.first}/, token.last)
}.gsub(/\/\//, "/")
end
Я знаю, что он делает;каким-то образом он возвращает URL, соответствующий файлу, расположенному на сервере.Таким образом, он возвращает строки, подобные этой: /path/to/my/file.html
Я понимаю, что если @url
уже имеет значение, оно будет возвращено, а правильное ||=
будет отброшено.Я также понимаю, что это начинает создавать хэш из двух элементов.
Я также думаю, что понимаю последний gsub;он заменяет обратную косую черту на косую черту (я думаю, для работы с серверами Windows).
Что меня поражает, так это часть inject
.Я не могу этого понять.Я использовал inject
раньше, но этот слишком для меня.Я не понимаю, как это сделать с each
, так как я не понимаю, что он делает.
Я немного изменил исходную функцию для этого вопроса;оригинал прибывает из этого файла джекила .
Приветствия!