首页 \ 问答 \ 在实现Clojure协议时,重载方法可以调用其重载的对应方吗?(When implementing a Clojure protocol, can an overloaded method call its overloaded counterpart?)

在实现Clojure协议时,重载方法可以调用其重载的对应方吗?(When implementing a Clojure protocol, can an overloaded method call its overloaded counterpart?)

这是重载协议定义的一部分:

(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中使用了两个定义,然后返回并添加了第二个。

但是当我将协议定义移动到一个单独的文件并尝试重新编译整个文件时,它会在第二个方法尝试调用第一个方法时抛出错误,大概是因为第一个方法尚未定义。

Clojure reify docs有这样的评论:

如果方法在协议/接口中过载,则必须提供多个独立的方法定义。

http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/reify

我想这些不是独立的定义。

什么是正确的方法来解决这个问题?


Here's part of an overloaded protocol definition:

(defprotocol ClientProtocol
  (create-edge
    [this outV label inV] 
    [this outV label inV data])

And here's part of its implementation:

(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)) 

It's spewing this error when the second method tries to call the first:

java.lang.RuntimeException: Unable to resolve symbol: create-edge in this context

I had both definitions working earlier in SLIME when I compiled it with the first function and then went back and added the second.

But when I moved the protocol definition into a separate file and tried to re-compile the whole thing, it throws an error when the second method tries to call the first, presumably because the first method hasn't been defined yet.

The Clojure reify docs have this comment:

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

I suppose these are not independent definitions.

What's the right way to approach this?


原文:https://stackoverflow.com/questions/10645155
更新时间:2023-08-12 21:08

最满意答案

按照以下几个步骤

1)将数据收集到变量或数组中

2)与数据库建立连接

3)使您的数据库处于可写模式

4)fire insert查询并关闭数据库


Follow this few steps

1) collect data into variable or in Array

2) make connection with database

3) get your database in writeable mode

4) fire insert query and close your database

相关问答

更多

相关文章

更多

最新问答

更多
  • 散列包括方法和/或嵌套属性(Hash include methods and/or nested attributes)
  • TensorFlow:基于索引列表创建新张量(TensorFlow: Create a new tensor based on list of indices)
  • 企业安全培训的各项内容
  • 错误:RPC失败;(error: RPC failed; curl transfer closed with outstanding read data remaining)
  • NumPy:将int64值存储在np.array中并使用dtype float64并将其转换回整数是否安全?(NumPy: Is it safe to store an int64 value in an np.array with dtype float64 and later convert it back to integer?)
  • 注销后如何隐藏导航portlet?(How to hide navigation portlet after logout?)
  • 将多个行和可变行移动到列(moving multiple and variable rows to columns)
  • 对setOnInfoWindowClickListener的意图(Intent on setOnInfoWindowClickListener)
  • Angular $资源不会改变方法(Angular $resource doesn't change method)
  • 如何配置Composite C1以将.m和桌面作为同一站点提供服务(How to configure Composite C1 to serve .m and desktop as the same site)
  • 不适用:悬停在悬停时:在元素之前[复制](Don't apply :hover when hovering on :before element [duplicate])
  • Mysql DB单个字段匹配多个其他字段(Mysql DB single field matching to multiple other fields)
  • 产品页面上的Magento Up出售对齐问题(Magento Up sell alignment issue on the products page)
  • 是否可以嵌套hazelcast IMaps?(Is it possible to nest hazelcast IMaps? And whick side effects can I expect? Is it a good Idea anyway?)
  • UIViewAnimationOptionRepeat在两个动画之间暂停(UIViewAnimationOptionRepeat pausing in between two animations)
  • 在x-kendo-template中使用Razor查询(Using Razor query within x-kendo-template)
  • 在BeautifulSoup中替换文本而不转义(Replace text without escaping in BeautifulSoup)
  • 如何在存根或模拟不存在的方法时配置Rspec以引发错误?(How can I configure Rspec to raise error when stubbing or mocking non-existing methods?)
  • asp用javascript(asp with javascript)
  • “%()s”在sql查询中的含义是什么?(What does “%()s” means in sql query?)
  • 如何为其编辑的内容提供自定义UITableViewCell上下文?(How to give a custom UITableViewCell context of what it is editing?)
  • c ++十进制到二进制,然后使用操作,然后回到十进制(c++ Decimal to binary, then use operation, then back to decimal)
  • 以编程方式创建视频?(Create videos programmatically?)
  • 无法在BeautifulSoup中正确解析数据(Unable to parse data correctly in BeautifulSoup)
  • webform和mvc的区别 知乎
  • 如何使用wadl2java生成REST服务模板,其中POST / PUT方法具有参数?(How do you generate REST service template with wadl2java where POST/PUT methods have parameters?)
  • 我无法理解我的travis构建有什么问题(I am having trouble understanding what is wrong with my travis build)
  • iOS9 Scope Bar出现在Search Bar后面或旁边(iOS9 Scope Bar appears either behind or beside Search Bar)
  • 为什么开机慢上面还显示;Inetrnet,Explorer
  • 有关调用远程WCF服务的超时问题(Timeout Question about Invoking a Remote WCF Service)