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
_评论由:nathanmarz_ 发布

这是一种好的解决方案,但似乎我的测试用例应该可以工作。我遇到了这个问题,因为我动态传递函数并保存它们以备后用—— 这个问题是与协议方法一起出现的。与普通函数不同地传递协议方法看起来并不正确。
0

评论者:hiredman

这是Clojure中协议实现的结果,协议扩展会改变变量,一旦你取了变量的值(这是顶级形式发生一次),你就不会看到变量的进一步变化,所以没有更多的协议扩展。

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