Clojure协议函数重载实现报错,求正确调用重载函数的方法
Clojure协议重载方法的正确实现与调用
首先看你定义的协议:
(ns com.mycompany.protocols.tools) (defprotocol Tool (test-ov [this] [this user-id]))
错误原因分析
- 实现方式1错误:在
deftype的协议实现块中,不能将多个参数列表嵌套在同一个test-ov表达式内,这种写法违反Clojure语法规则,导致编译器误将返回值1111识别为绑定形式,抛出Unsupported binding form错误。 - 实现方式2错误:无参版本的
test-ov中直接调用test-ov时,当前上下文里该符号尚未完成绑定,无法被解析,必须通过命名空间限定符明确指定协议函数。
正确实现方式
正确的做法是将每个重载方法单独定义,调用重载版本时使用命名空间限定的协议函数:
(ns com.mycompany.resources.tools (:require [com.mycompany.protocols.tools :as proto])) (deftype MyTool [config] proto/Tool ;; 实现带user-id参数的版本 (test-ov [this user-id] 1111) ;; 实现无参版本,调用带参数的重载版本 (test-ov [this] (proto/test-ov this nil)))
也可以使用Java互操作语法直接调用方法(deftype会生成Java类):
(ns com.mycompany.resources.tools (:require [com.mycompany.protocols.tools :as proto])) (deftype MyTool [config] proto/Tool (test-ov [this user-id] 1111) (test-ov [this] (.test-ov this nil)))
两种写法都能正常工作,核心是确保调用重载方法时,符号能被正确解析到协议定义的函数。
内容的提问来源于stack exchange,提问作者Laodao
相关产品推荐
相关产品推荐

