[英]Why isn't dissoc implemented for vectors in clojure?
我知道clojure的clojure.lang.IPersistentVector
实现了assoc
,如(assoc [0 1 2 3] 0 -1) ; => [-1 1 2 3]
(assoc [0 1 2 3] 0 -1) ; => [-1 1 2 3]
。 我也听过(如在这个答案中)clojure的向量不实现dissoc
,如(dissoc [0 1 2 3] 0) ; => [1 2 3]
(dissoc [0 1 2 3] 0) ; => [1 2 3]
。 如果使用subvec
很容易重现这个功能,那么为什么它不应该在clojure.lang
, clojure.core
甚至contrib中实现? 如果没有,那背后有什么理由吗?
由于两个原因,Dissoc对向量没有多大意义:
dissoc
的意思是“删除密钥”。 您无法从矢量中移除键而不会导致其他副作用(例如,移动所有未来值) dissoc
将对向量执行相对较差。 Clojure核心通常避免实现对特定数据结构无效/无意义的操作。 基本上,如果您发现自己想要对向量进行dissoc
,则可能使用了错误的数据结构。 持久性hashmap或set可能是更好的选择。
如果你想要一个数据结构作为向量,但支持有效地剪切和插入元素或子序列,那么值得检查RRB树: https : //github.com/clojure/core.rrb-vector
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.