问题描述
我在将 peek
函数与 seq 对象一起使用时遇到错误。这对我来说有点令人惊讶,因为我期望 peek
可以与任何 seq 对象一起使用。
(def r0
(re-seq #"\w+" "foo bar"))
(identity r0)
;; ("foo" "bar")
(peek r0)
; (err) Execution error (ClassCastException) at (REPL:1).
(peek '("foo" "bar"))
;; "foo"
(= r0 '("foo" "bar"))
;; true
(type r0)
;; clojure.lang.Cons
(type '("foo"))
;; clojure.lang.PersistentList
documentation of peek
表示 peek
接受一个集合对象。但是序列也是集合,对吧?但是 peek
不支持它。那么,这是一个文档错误吗?还是我错过了什么?
解决方法
根据 tomby42 8.2 年前在文档说明中的说法,
peek
与“实现 clojure.lang.IPersistentStack
(如 clojure.lang.Persistent*
)的持久类型”一起使用。
Clojure 在 Clojure 1.10.1 中函数 peek
的文档字符串(在撰写本文时为当前版本)是:“对于列表或队列,与第一个相同,对于向量,相同,但更多
比上一个更有效率。如果集合为空,则返回 nil。"
在有关 Clojurians Slack 的 peek 文档的一些讨论中,听起来可能 peek 的文档字符串中的“集合”一词指的是前面提到的列表、队列或向量的集合类型之一,而不是任意的 Clojure 集合。也就是说,它应该被解释为“集合”一词被替换为短语“列表、队列或向量”。