【问题标题】:In Clojure, how to check if an object is a core.async channel?在 Clojure 中,如何检查对象是否是 core.async 通道?
【发布时间】:2017-11-28 14:36:27
【问题描述】:

有一个函数chan 可以创建一个频道。但我没有看到chan?。 我将如何编写一个谓词chan?,它为chan 创建的对象返回true?

我问的是 Clojure 和 ClojureScript。

【问题讨论】:

标签: clojure clojurescript core.async


【解决方案1】:

因为频道是implemented as:

(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 之间的工作方式似乎不同。我知道这适用于前者;不确定后者。
  • 如果您经常调用它,强烈推荐instance? ManyToManyChannel 解决方案,因为它比satisfies? ... 解决方案快大约10,000 倍,在我的机器上大约是4 纳秒,而大约是40 微秒。在疯狂地寻找为什么我的程序运行速度只有一半(在一个重要的内部函数中使用了大约 4 次)之后,我发现了这一点。避免我的命运;-)
猜你喜欢
  • 2015-07-04
  • 2015-05-07
  • 2015-07-11
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2020-12-23
  • 1970-01-01
相关资源
最近更新 更多