在Clojure中,如何检查一个对象是否是core.async通道?

3

有一个函数chan用于创建通道,但我没有看到chan?

如何编写一个谓词chan?,以便它返回由 chan 创建的对象为真?

我的问题适用于Clojure和ClojureScript。


在 JIRA 中有一个你可以投票的未解决问题:https://dev.clojure.org/jira/browse/ASYNC-74。 - glts
1个回答

9

因为通道是实现为:

(deftype ManyToManyChannel [^LinkedList takes ^LinkedList puts ^Queue buf closed ^Lock mutex add!]
   ...)

您可以检查它是否为ManyToManyChannel的实例:
(import [clojure.core.async.impl.channels ManyToManyChannel])

(instance? ManyToManyChannel obj)

或者,如果你更关心协议而不是类型本身,你可以检查对象是否符合其中一个协议:satisfies?

(satisfies? clojure.core.async.impl.protocols/WritePort
            obj)

@RobN 我应该指出我不懂Clojurescript。但是快速搜索显示import在clj和cljs之间似乎有不同的工作方式。我知道这适用于前者;不确定后者是否适用。 - Carcigenicate
如果您需要频繁调用此函数,强烈建议使用instance? ManyToManyChannel解决方案,因为它比satisfies? ...解决方案快大约10,000倍,我的机器上大约是4纳秒对比40微秒。在我疯狂寻找为什么我的程序运行速度减半时(在一个重要的内部函数中使用了这个函数大约4次),我发现了这一点。避免我的命运;-) - Ryan Tate

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