我一直在尝试重新实现更新作为学习练习,并一直在使用 Clojure 的 core.clj GitHub 来寻找明确的答案。我发现了该函数的两个单独的定义,一个在 Master 中分支:
(defn update-in
;; metadata removed
{:added "1.0"
:static true}
([m ks f & args]
(let [up (fn up [m ks f args]
(let [[k & ks] ks]
(if ks
(assoc m k (up (get m k) ks f args))
(assoc m k (apply f (get m k) args)))))]
(up m ks f args))))
其中一个位于 010864f8ed...树:
(defn update-in
;; metadata removed
{:added "1.0"
:static true}
([m [k & ks] f & args]
(if ks
(assoc m k (apply update-in (get m k) ks f args))
(assoc m k (apply f (get m k) args)))))
大概(虽然我不知道如何找出),非Master树中的版本较新,并且没有被带入Master中。我尝试在 REPL 中实现非 Master 版本,它似乎工作正常。我可以看到参数略有不同,并且在 REPL 中调用 (doc update-in)
返回与树定义相同的参数。
我也有点困惑为什么 Master 中的定义比非 Master 版本更详细,它似乎使用了已建立的 Clojure 函数(即后续版本中没有引入任何内容)。
请有人:
- 澄清一下这两个不同的版本是什么?
- 解释一下为什么当树的更简洁的定义有效时(尽管参数略有不同),Master 的更详细的定义却存在?它刚刚经过重构以提高工作效率吗?
最佳答案
master 实际上是最新的,这可以通过查看两棵树的 Blame 结果看出。对于 Master 分支,您可以看到引入更改的提交名为 improve update-in perf 。我在提交中没有看到任何更多信息,坦率地说,这不好。
该补丁引入了一个本地函数,该函数会更改当存在非空 ks
参数时所执行的操作(一般情况,当下降到键时)。通过 apply
对 update-in
的递归调用被对 up
的直接调用所取代。
关于git - Clojure:GitHub 中 update-in 的两种不同定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41158091/