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

标签 clojure

这是重载协议(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]]))

关于clojure - 实现 Clojure 协议(protocol)时,重载方法能否调用其重载对应项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10645155/

相关文章:

xml - Nokogiri 的 clojure 等价物是什么(用于使用 xpath 和 css 选择器解析 xml)

clojure - 将 ClojureScript 与 OpenJDK 一起使用的解决方法?

clojure - 如何使用 Clojure 查找序列中元素最后一次出现的位置?

java - 在 Clojure 中使用重定向到 http ://foobar. mp3 的 http ://fizzbar. mp3

namespaces - Clojure:函数的全限定名

clojure - 不知道如何从 : clojure. lang.Symbol 创建 ISeq

types - 在运行时访问 clojure 类型提示

Emacs + Cider (Clojure) + 自动完成 : How to get the docstring?

clojure - 无参数(和)返回 t

clojure - 这种连续传递风格的 Clojure 函数生成器是如何工作的?