我在想,clojure.zip/next 的文档字符串是否会误导一些人,它的内容如下:
使用深度优先遍历移动到层次结构中的下一个位置。
当到达末尾时,返回一个特殊位置,可以通过 end? 标识。如果已到达末尾,则保持在该位置。
如果在末尾,即使调用 next,也不会移动到末尾之外。
一些人可能会在没有更明确指导的情况下假设,ZIPPER 的末尾是最后一个节点,在那个点调用 next 会将 ZIPPER 定位到最后一个节点。
就我所理解的而言(这可能不是特别准确),当在 ZIPPER 的最后一个节点后面调用 next 时,Clojure ZIPPER 的末尾状态会被触发,之后
- ZIPPER 将不再可导航或更新。
- 您仍然可以调用 root(或 node,此时与 root 相当),next 和 end?,但除此之外,我认为,这就算结束了。
以下是一些示例代码以展示行为
(require '[clojure.zip :as czip])
(->> [1 2 3]
czip/vector-zip
(iterate czip/next)
(take 10)
(map (juxt czip/node czip/end?)))
;; => ([[1 2 3] false]
;; [1 false]
;; [2 false]
;; [3 false]
;; [[1 2 3] true]
;; [[1 2 3] true]
;; [[1 2 3] true]
;; [[1 2 3] true]
;; [[1 2 3] true]
;; [[1 2 3] true])
next 的文档字符串可能需要更多地讨论什么是“末尾”,什么是指达到末尾状态。也许像这样:
使用深度优先遍历移动到层次结构中的下一个位置。
当到达末尾时,即最后一个节点之后,通过 end? 返回一个特殊位置。如果已到达末尾,则保持在末尾。
在末尾时,有效的调用有 end?、next 和 root。
如果文档字符串不是正确的位置,那么ZIPPER 概述可以详述?