欢迎!请参阅 关于 页面获取更多关于此处如何工作的小信息。
鉴于 peek 是一个读取操作,这看起来似乎是一个疏忽。
输入
(peek (transient [:a :b :c]))
预期结果
:c
实际结果
未处理的 java.lang.ClassCastException:clojure.lang.PersistentVector$TransientVector 无法转换为 clojure.lang.IPersistentStack
评论者:[email protected]
我今天遇到了这个问题。我同意如果 {{peek}} 能在 transient 向量上工作会方便很多。其他函数如 {{nth}} 和 {{count}} 都能在 transient 向量上工作,所以想使用 {{peek}} 是很自然的。
作为一个应对方案(而不是建议的修复),我使用以下代码
(defn peek! [tv] (nth tv (dec (count tv))))
诚然,这可能会产生误解,但这符合常规集合代码中 transient 转换的叹号模式。我还有一个方便的函数 update!,它调用 assoc!。我提供这个方案只是为了那些遇到这个问题并想尽快返回工作的用户。
update!
assoc!
评论者:alexmiller
我认为这意味着 PersistentVector.TransientVector 需要支持 IPersistentStack,但它有两个方法 - peek 和 pop。有趣的是,ITransientVector 和 TransientVector 都已经有了 pop() 方法。似乎 pop() 的实现已经有足够智能来实施 peek() 了。