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

纳撤尼尔,
不知道你是否尝试过这个,但是用

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

0
_评论者:nathanmarz_

这是一个有效的解决办法,但我的测试用例应该能正常工作。我遇到这个问题是因为我在动态传递函数并在之后执行时保存它们 —— 而且这个问题在协议方法中出现了。被迫以一种不同于常规函数的方式来传递协议方法似乎不正确。
0

评论人:hiredman

这是由 Clojure 协议实现的结果,协议扩展改变了 vars,一旦你取了 var 的值(这在顶层形式中出现一次)你就不会再看到 var 的进一步改变,所以不会再有协议扩展。

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