微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

peek 不支持某些序列

如何解决peek 不支持某些序列

我在将 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 集合。也就是说,它应该被解释为“集合”一词被替换为短语“列表、队列或向量”。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。