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

欢迎!请参阅关于页面以了解如何工作的更多信息。

+2
集合

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

输入

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

预期结果

:c

实际结果

未处理的java.lang.ClassCastException clojure.lang.PersistentVector$TransientVector无法转换为clojure.lang.IPersistentStack

3 答案

0

评论者:[email protected]

我今天遇到了这个问题。我同意如果{{peek}}能够在临时向量上工作将很有用。其他如{{nth}}和{{count}}这样的函数可以在临时向量上工作,所以{{peek}}是自然的选择。

作为一个权宜之计(而不是建议的修复方案),我使用这个

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

诚然,这只是一个错误的称呼,但它在常规集合代码的临时转换中符合感叹号模式。我还有一个方便的函数update!,它调用assoc!。我提出这个权宜之计,只是为了那些遇到这个问题并希望继续工作的用户。

0

评论者:alexailler

我认为这需要PersistentVector.TransientVector支持IPersistentStack,但它有两个方法:peek和pop。值得注意的是,ITransientVector和TransientVector都已经有pop()了。看起来pop()的实现在实现peek()时也需要这些智能。

0
参考: https://clojure.atlassian.net/browse/CLJ-2464(由 alex+import 提出)
...