2024 年 Clojure 状态调查! 中分享您的想法。

欢迎使用!请查看 关于 页面以了解更多关于此功能的信息。

+2
集合

考虑到 peek 是一种读取操作,这似乎是一个疏忽。

输入

(peek (transient [:a :b :c]))

预期结果

:c

实际结果

未处理的 java.lang.ClassCastException: clojure.lang.PersistentVector$TransientVector cannot be cast to clojure.lang.IPersistentStack

3 答案

0

评论者:[email protected]

我今天遇到了这个问题。我同意如果能对 transient 向量使用 peek 就会很方便。例如,nth 和 count 等其他函数可以在 transient 向量上工作,因此自然想要 peek。

作为一种权宜之计(而不是建议的修复),我使用了以下代码

(defn peek! [tv] (nth tv (dec (count tv))))

诚然,这是一个误称,但它在常规集合代码的 transient 转换模式中符合 bang 模式。我还有一个方便的函数 update!,它调用 assoc!。我提供这个权宜之计,仅供遇到这个问题并希望回到工作的人使用。

0

评论者:alexmiller

我认为这意味着 PersistentVector TransientVector 需要支持 IPersistentStack,但它有两种方法 - peek 和 pop。有趣的是,ITransientVector 和 TransientVector 都有 pop() 方法。似乎 pop() 实现中有你实现 peek() 所需要的一切智能。

0
by
参考资料:https://clojure.atlassian.net/browse/CLJ-2464(由 alex+import 报告)
...