您如何确定集合是否是暂时的?

时间:2014-03-16 04:44:06

标签: clojure internals

我想测试一个集合是否是瞬态的。我尝试了以下功能:

(defn transient? [coll]
  (extends? clojure.lang.ITransientCollection (type coll)))

但它不起作用:

user=> (transient? {})
NullPointerException   clojure.core/implements? (core_deftype.clj:512)

user=> (transient? (transient {}))
NullPointerException   clojure.core/implements? (core_deftype.clj:512)

extends?的文档未提及它无论如何都适用于Java接口。我只是希望他们能够工作。有没有其他方法可以确定集合是否是瞬态的?

我正在使用Clojure 1.5.1。

1 个答案:

答案 0 :(得分:4)

您需要使用instance?而不是extends?

extends?询问类型是否扩展了协议。 ITransientCollection是一个Java接口,而不是协议,所以instance?就是这个工具。

user=> (instance? clojure.lang.ITransientCollection (transient {}))
true

user=> (instance? clojure.lang.ITransientCollection {})
false