clojure - 我们如何测试某物是否是引用?

标签 clojure

现在我正在使用这个:
(instance? clojure.lang.IDeref x)
...但我怀疑可能有更好/更惯用的方法来做到这一点。

最佳答案

这是不正确的,您正在检查对象 x 是否实现了 IDeref 接口(interface),这仅意味着您可以使用 @ 符号取消引用该对象。你想要的是这样的:

 (instance? clojure.lang.Ref x)

编辑:

(调整评论)。

您可以按照您的建议进行操作,但这具有对其他用户制作的对象进行分类的缺点,这些用户将 IDeref 扩展为被视为引用类型。还要考虑 vars 也表现为引用类型,但不使用 IDeref 接口(interface)。

这里有两个不错的选择。您可以编写一个使用 or 语句的函数:
 (def ref? [x] 
    (or (instance? clojure.lang.Ref x)
        (instance? clojure.lang.Agent x)
        ...))

或者你可以使用协议(protocol)来定义一个新的谓词。这具有可扩展的优点。
 (defprotocol Ireference? (reference? [this]))

 (extend-type java.lang.Object Ireference? (reference? [this] false))
 (extend-type nil Ireference (reference? [this] false))
 (extend-type clojure.lang.Ref Ireference? (reference? [this] true))
 (extend-type clojure.lang.Agent Ireference? (reference? [this] true))

 ;;user=> (reference? nil)
 ;;false
 ;;user=> (reference? (ref 0))
 ;;true

另一个例子见http://dosync.posterous.com/51626638

关于clojure - 我们如何测试某物是否是引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7293289/

相关文章:

clojure - 带参数的代理函数示例

programming-languages - 哪些因素可以决定 Clojure、Scala 或 Haskell 是否会获得关注?

clojure - 如何根据 Clojure 中的序列创建集合

windows - 在 Emacs + Slime + Clojure + Windows 设置中,无法加载 clojure-auto

lisp - 为什么 Clojure 除了 "keywords"之外还有 "symbols"?

syntax - 何时在 clojure require 中包含撇号?

regex - 使用正则表达式从 clojure 集合中提取字符串

clojure - 在 Clojure 中应用/合并的奇怪事情

clojure - 如何创建从字符串而不是文件或 url 读取的输入流

api - CouchDB Clojure 客户端 API 可用吗?