我想了解以下代码的工作原理:
def url
@url ||= {
"basename" => self.basename,
"output_ext" => self.output_ext,
}.inject("/:basename/") { |result, token|
result.gsub(/:#{token.first}/, token.last)
}.gsub(/\/\//, "/")
end
我知道它的作用;它以某种方式返回与位于服务器上的 oa dir 的文件相对应的 url。所以它返回类似于这样的字符串:/path/to/my/file.html
我理解如果@url
已经有一个值,它会被退回,权利||=
会被丢弃。我也明白这开始创建两个元素的哈希。
我也认为我理解了最后一个 gsub;它用斜杠替换反斜杠(我猜是为了应对 Windows 服务器)。
令我惊讶的是这个inject
部分。我无法理解它。我以前用过inject
,但是这个对我来说太多了。我不明白如何用 来完成each
,因为我不明白它的作用。
针对这个问题,我稍微修改了原函数;原件来自这个 jekyll 文件。
干杯!