欢迎使用!请查看 关于 页面以了解更多关于此功能的信息。
考虑到 peek 是一种读取操作,这似乎是一个疏忽。
输入
(peek (transient [:a :b :c]))
预期结果
:c
实际结果
未处理的 java.lang.ClassCastException: clojure.lang.PersistentVector$TransientVector cannot be cast to clojure.lang.IPersistentStack
评论者:[email protected]
我今天遇到了这个问题。我同意如果能对 transient 向量使用 peek 就会很方便。例如,nth 和 count 等其他函数可以在 transient 向量上工作,因此自然想要 peek。
作为一种权宜之计(而不是建议的修复),我使用了以下代码
(defn peek! [tv] (nth tv (dec (count tv))))
诚然,这是一个误称,但它在常规集合代码的 transient 转换模式中符合 bang 模式。我还有一个方便的函数 update!,它调用 assoc!。我提供这个权宜之计,仅供遇到这个问题并希望回到工作的人使用。
update!
assoc!
评论者:alexmiller
我认为这意味着 PersistentVector TransientVector 需要支持 IPersistentStack,但它有两种方法 - peek 和 pop。有趣的是,ITransientVector 和 TransientVector 都有 pop() 方法。似乎 pop() 实现中有你实现 peek() 所需要的一切智能。