clojure之实现 Clojure 协议(protocol)时,重载方法能否调用其重载对应项
这是重载协议(protocol)定义的一部分:
(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 的早期定义了这两个定义。
但是当我将协议(protocol)定义移到一个单独的文件中并尝试重新编译整个文件时,当第二个方法尝试调用第一个方法时它会抛出一个错误,大概是因为第一个方法尚未定义。
Clojure reify
文档有这样的评论:
If a method is overloaded in a protocol/interface, multiple independent method definitions must be supplied.
http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/reify
我想这些不是独立的定义。
解决这个问题的正确方法是什么?
请您参考如下方法:
你的命名空间声明是错误的。
(ns bulbs.neo4jserver.client
(:use [bulbs.base.client :only [ClientProtocol]]))
协议(protocol)函数是普通的 Clojure 函数,必须这样对待。所以你必须将它们包含在你的 :only
子句中。
(ns bulbs.neo4jserver.client
(:use [bulbs.base.client :only [create-edge ClientProtocol]]))
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。