2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面获取更多关于这个网站是如何工作的信息。

+2
协议

`
(defprotocol TestProtocol
(tester [o]))

(let [t tester]
(defn another-tester [o]
(t o)))

(def another-tester2 tester)

(extend-protocol TestProtocol
String
(tester [o] (println "Strings work!")))

(another-tester "A") ;; 错误
(another-tester2 "A") ;; 错误
(tester "A") ;; 运行正常

(let [t tester]
(defn another-tester [o]
(t o)))

(another-tester "A") %% 运行正常

(def another-tester2 tester)

(another-tester2 "A") ;; 运行正常

(extend-protocol TestProtocol

(tester [o] (println "Longs work!")))

(another-tester "A") %% 运行正常
(another-tester 3) ;; 错误
(another-tester2 3) ;; 错误
`

5 个回答

0
_评论由:nathanmarz_

这个问题似乎与 Clojure 有关特定 – 我在做一些 CLJS 测试时无法重现这个问题。
0

评论由:gshayban

Nathan,
不清楚你是否尝试过这个,但是用

`(def another-handle #'the-protocol-function)`
而不是直接进行 deref。

0
_评论由:nathanmarz_

这是一个好的权宜之计,但我的测试用例似乎应该工作。我遇到这个问题是因为我在动态传递函数并在稍后执行它们——协议方法出现此问题。必须以不同于常规函数的方式传递协议方法似乎不正确。
0

评论者:hiredman

这是 Clojure 协议实现的结果,协议扩展会修改变量。一旦取出了变量的值(对于顶层形式只发生一次),就不再看到该变量的进一步修改,因此不再进行协议扩展。

0
参考:[https://clojure.atlassian.net/browse/CLJ-1796](https://clojure.atlassian.net/browse/CLJ-1796)(由 alex+import 提出)
...