这是重载协议定义的一部分:
(defprotocol ClientProtocol
(create-edge
[this outV label inV]
[this outV label inV data])
这是其实现的一部分:
(ns bulbs.neo4jserver.client
(:use [bulbs.base.client :only [ClientProtocol]]))
(deftype Neo4jClient [ns config]
ClientProtocol
(create-edge
[this outV label inV data]
(let [inV-uri (utils/normalize-uri (build-path neo4j-uri vertex-path inV))
path (build-path vertex-path, outV, "relationships")
params {:to inV-uri, :type label, :data (first data)}]
(post config path params)))
(create-edge
[this outV label inV]
;; it doesn't like this call...
(create-edge this outV label inV nil))
当第二种方法尝试调用第一种方法时,它会发出此错误:
java.lang.RuntimeException: Unable to resolve symbol: create-edge in this context
当我使用第一个函数编译它然后返回并添加第二个函数时,我在 SLIME 中的两个定义都在早期工作。
但是当我将协议定义移动到一个单独的文件中并尝试重新编译整个东西时,当第二种方法尝试调用第一种方法时,它会引发错误,大概是因为第一种方法尚未定义。
Clojurereify
文档有这样的评论:
如果一个方法在协议/接口中被重载,则必须提供多个独立的方法定义。
http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/reify
我想这些不是独立的定义。
解决这个问题的正确方法是什么?