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
Long
(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)`
而不是直接解引用。

0
_评论由:nathanmarz_ 制作

这是一个有效的解决方案,但我的测试用例似乎应该正常工作。我遇到这个问题是因为我动态传递函数并保存它们以便稍后执行—— 并且这个问题与协议方法一起出现。与普通函数不同地传递协议方法似乎不正确。
0

评论者:hiredman

这是 Clojure 协议实现的结果,协议扩展会修改 var,一旦你取了 var 的值(这对于顶层形式来说只会发生一次),你将不会看到 var 的进一步突变,所以无法进行更多的协议扩展。

0
参考:https://clojure.atlassian.net/browse/CLJ-1796(由 alex+import 报告)
...