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 "字符串工作!")))

(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 "长整数工作!")))

(another-tester "A") ;; 工作正常
(another-tester 3) ;; 错误
(another-tester2 3) ;; 错误
`

5 个回答

0
_由:nathanmarz_评论

这个问题似乎特定于 Clojure - 我在 CLJS 中进行了一些测试,但无法重现此问题。
0

评论由:gshayban

Nathan,
不确定您是否尝试了这个,但使用

`(def another-handle #'the-protocol-function)`
而不是直接解引用。

0
by
_由:nathanmarz_评论

这是一个不错的选择,但我的测试用例似乎应该能正常工作。我遇到这个问题是因为我在动态传递函数并在稍后执行它们——这个问题和协议方法有关。需要不同地传递协议方法和常规函数似乎不太对。
0
by

评论者:hiredman

这是Clojure协议实现的结果,协议扩展会修改变量。一旦取了变量的值(这在顶级形式发生一次),你将看不到变量的进一步修改,因此不再进行协议扩展。

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