gpt4 book ai didi

clojure - 如何使用具有与 clojure.core 函数同名的方法的协议(protocol)来扩展 java 类?

转载 作者:行者123 更新时间:2023-12-02 16:37:22 29 4
gpt4 key购买 nike

我正在尝试使用此协议(protocol)扩展一个简单的java类toxi.color.ColorList:

(defprotocol countable
(count [this]))

(extend-protocol countable
ColorList
(count [this]
(.size this)))

当我评估这段代码时,我看到这些警告

Warning: protocol #'dat00.protocols/countable is overwriting function count

WARNING: count already refers to: #'clojure.core/count in namespace: dat00.protocols, being replaced by: #'dat00.protocols/count

但这工作正常:

(count (ColorList.))
=> 0

但是如果我在同一个文件(或命名空间)中尝试这个

(count (range 5))
=> IllegalArgumentException No implementation of method: :count of protocol: #'dat00.protocols/countable found for class: clojure.lang.LazySeq clojure.core/-cache-protocol-fn (core_deftype.clj:541)

所以我的问题是:
我是否误解了协议(protocol)的一些细节?

谢谢!

最佳答案

您遇到命名空间冲突。

定义协议(protocol)时,您正在当前命名空间中定义调度函数。如果您确实想要使用“count”,则必须在命名空间声明中排除 clojure.core 版本。

(ns so.protocols 
(:refer-clojure :exclude [count]))

现在,在该命名空间中,您可以使用“count”方法定义协议(protocol)。如果您希望在该命名空间中使用 count 的核心版本,则可以在命名空间中添加前缀 clojure.core/count

您的协议(protocol)的用户将希望为您的命名空间添加别名。例如,

(ns user 
(:require [so.protocols :as p]))

因此,p/count 是您的协议(protocol)方法,而 count 是核心。

关于clojure - 如何使用具有与 clojure.core 函数同名的方法的协议(protocol)来扩展 java 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23252713/

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