(conj (drop-last "abcde") (last "abcde"))
返回值为(\e \a \b \c \d)
我很困惑。在conj
的文档中,我注意到:
根据具体类型,“添加”可能发生在不同的“位置”。
这是不是意味着对于LazySeq
,新项的添加位置是头部?
如何得到结果(\a \b \c \d \e)
?
(conj (drop-last "abcde") (last "abcde"))
返回值为(\e \a \b \c \d)
我很困惑。在conj
的文档中,我注意到:
根据具体类型,“添加”可能发生在不同的“位置”。
这是不是意味着对于LazySeq
,新项的添加位置是头部?
如何得到结果(\a \b \c \d \e)
?
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"))
需要认识到的是,conj
只是在 Clojure 的 Java 代码中将 IPersistentCollection
接口上的 cons
实现委托出去。因此,它的行为取决于所处理的数据结构。
conj
的意图是始终以最高效的方式向数据结构添加项。
对于列表来说,最有效的位置是前面。对于向量来说,最有效的位置是末尾。