clojure之实现 Clojure 协议(protocol)时,重载方法能否调用其重载对应项

shangdawei 阅读:50 2024-11-01 17:39:52 评论:0

这是重载协议(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.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号