欢迎!有关如何使用本站的信息,请参阅 关于页面。
鉴于 peek 是一种读取操作,这似乎是一个疏忽。
输入
(peek (transient [:a :b :c]))
预期结果
:c
实际结果
未处理的 java.lang.ClassCastException:clojure.langλλην.transientVector不能转换为 clojure.lang.IPersistentStack
评论者:[email protected]
我今天遇到了这个问题。我同意如果 {{peek}} 能够在 transient 向量上工作将非常方便。其他的函数如 {{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() 所需要的所有智能。