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
__comment made by: nathanmarz_

这个问题看起来是Clojure特有的——我在CLJS中进行了测试,但无法重现这个问题。
0

_comment made by: gshayban

Nathan,
不清楚您是否尝试过这个方法,但是使用

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

0
__comment made by: nathanmarz_

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

评论者:hiredman

这是由于clojure中协议实现的结果,协议扩展会修改变量,一旦你取了变量的值(这是在顶层形式发生一次时发生的),你就不会再看到变量的进一步修改,因此不会再有协议扩展。

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