为什么clojure中的矢量没有实现dissoc?

时间:2014-08-29 02:03:00

标签: clojure

我知道clojure的clojure.lang.IPersistentVector实现了assoc,就像(assoc [0 1 2 3] 0 -1) ; => [-1 1 2 3]一样。我也听到(如在this回答中)clojure的向量没有像dissoc那样实现(dissoc [0 1 2 3] 0) ; => [1 2 3]。如果使用subvec轻松重现此功能,是否有任何真正原因导致它不应在clojure.langclojure.core甚至是contrib中实现?如果没有,那背后有什么理由吗?

1 个答案:

答案 0 :(得分:9)

Dissoc对矢量没有多大意义,原因有两个:

  1. dissoc的含义是"删除密钥"。您无法从矢量中移除某个键而不会产生其他副作用(例如,移动所有未来的值)
  2. 如果必须移动所有后续键,
  3. dissoc对矢量的表现相对较差 - 大概是O(n)与相当多的GC。 Clojure核心通常避免实施对特定数据结构没有效率/不合理的操作。
  4. 基本上,如果您发现自己想要对向量执行dissoc,则可能使用了错误的数据结构。持久性hashmap或set可能是更好的选择。

    如果你想要一个数据结构作为向量,但支持有效地剪切和插入元素或子序列,那么值得检查RRB树:https://github.com/clojure/core.rrb-vector