分享您的看法,请参与 2024 Clojure 状态调查!

欢迎!有关如何使用本站的信息,请参阅 关于页面

+2
集合

鉴于 peek 是一种读取操作,这似乎是一个疏忽。

输入

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

预期结果

:c

实际结果

未处理的 java.lang.ClassCastException:clojure.langλλην.transientVector不能转换为 clojure.lang.IPersistentStack

3 答案

0

评论者:[email protected]

我今天遇到了这个问题。我同意如果 {{peek}} 能够在 transient 向量上工作将非常方便。其他的函数如 {{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
参考: https://clojure.atlassian.net/browse/CLJ-2464(由 alex+import 报告)
...