有人能解释一下 "conj" 的行为吗?(关于IT技术)

5
(conj (drop-last "abcde") (last "abcde"))

返回值为(\e \a \b \c \d)

我很困惑。在conj的文档中,我注意到:

根据具体类型,“添加”可能发生在不同的“位置”。

这是不是意味着对于LazySeq,新项的添加位置是头部? 如何得到结果(\a \b \c \d \e)


可能重复:https://dev59.com/SWs05IYBdhLWcg3wG-VR#7438355 - Gert
2个回答

6
“'addition' 可能发生在不同的 '位置' 上,这取决于具体的类型。” 这指的是 Clojure 的持久化集合的行为,它们以与性能和底层实现相关的最有效的方式合并添加。
向量始终添加到集合的末尾:
user=> (conj [1 2 3] 4)
[1 2 3 4]

使用列表,conj将项目放在列表的前面,正如您所注意到的:

user=> (conj '(1 2 3) 4)
(4 1 2 3)

是的,LazySeq在其具体实现方面与List一样对待。

我如何得到 (\a \b \c \d \e) 作为结果?

有很多方法,但你可以很容易地从LazySeq创建一个vector:

(conj (vec (drop-last "abcde"))
      (last "abcde"))

1

需要认识到的是,conj 只是在 Clojure 的 Java 代码中将 IPersistentCollection 接口上的 cons 实现委托出去。因此,它的行为取决于所处理的数据结构。

conj 的意图是始终以最高效的方式向数据结构添加项。

对于列表来说,最有效的位置是前面。对于向量来说,最有效的位置是末尾。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接