3

Other是 . 的更复杂版本(包装)What。它做了什么What,但更多。我小心地定义了 2 个命名空间。

(ns what)

(defprotocol IWhatever
  (whatever [this]))

(deftype What []
  IWhatever
  (whatever [this]
            (str "whatever")))

(whatever (->What))

(ns other (:require what))

(deftype Other []
  what/IWhatever
  (whatever [this]
            (what/whatever (what/->What))))

(whatever (->Other)) ;bad line

错误是:

clojure.lang.Compiler$CompilerException: java.lang.RuntimeException: Unable to resolve symbol: whatever in this context, compiling:(C:\...)

为什么最后一个表达式不能解决?就像找不到名称一样,但是正如您所见,我在当前命名空间下重新定义了它。

这是无意义的代码,但我使用了最简单的问题示例来说明这一点。如果相关的话,我会在 LightTable 中运行它。

4

1 回答 1

3

使用定义协议的名称空间限定最后一行。我一直在想尝试调用命名空间whatever中的方法,other因为它是在那里定义的。

(what/whatever (->Other))

感谢@soulcheck 和其他所有花时间提供帮助的人。

于 2014-10-01T20:25:32.170 回答