如何从Clojure/core.async获取通道的缓冲区大小?

4

我希望知道如何在Clojure中获取通道的大小。 我尝试使用count,但它不被支持。 Clojure文档通常很好,但这次我找不到任何关于它的信息。

示例:

(def channel1 (chan 3))
(println(count channel1))
Should be 3 but  throws  "count not supported on this type: ManyToManyChannel"

1
通道并不保证具有缓冲区。你正在做的事情是依赖于实现的,可能随时停止工作,并且在任意通道实现上都无法工作。通道是一个接口,而不是一种类型,因此除了该接口指定的内容外,您不能依赖于任何其他东西。即使是带缓冲区的通道(如 (chan 3) 创建的通道)也可以在未来以任何喜欢的方式实现其缓冲区,而不一定是今天实现的方式。 - amalloy
@amalloy 谢谢您的回复。我只是在完成我的学业作业。所以我对此很满意。同时,在写作过程中,我意识到我不再需要缓冲区的大小 :-) - TruckerCat
1
不要将您的答案编辑到问题中,如果您将答案发布为答案,则有助于 SO 的机制。这样,稍后点击进入的人可以直接转到已有答案的问题。 - Arthur Ulfeldt
@Arthur Ulfeldt 完成了 :-) - TruckerCat
1个回答

10

我找到了解决方案。

(.buf (.buf ch)) ;; Get elements in buffer
;; => (:chan :on :elements)

(.count (.buf ch)) ;; Get number of elements in buffer
;; => 3

(.n (.buf ch)) ;; Get size of buffer
;; => 10

(.full? (.buf mychan)) ;; Is buffer full?
;; => false

更多阅读请点击这里


你不需要使用 .count,可以直接使用 count,因为缓冲区实现了 ICounted - Didier A.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接