gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:26:45 25 4
gpt4 key购买 nike

现在我正在使用这个:
(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com