对我来说,我遇到了一个看似与clojure记录有关的略微令人惊讶的行为.
设置如下:
一个名称空间定义记录类型:
(ns defrecordissue.arecord)
(defrecord ARecord [])
Run Code Online (Sandbox Code Playgroud)另一个命名空间定义了一个协议,并将其扩展为1中定义的记录类型:
(ns defrecordissue.aprotocol
(:require [defrecordissue.arecord])
(:import [defrecordissue.arecord ARecord]))
(defprotocol AProtocol
(afn [this]))
(extend-protocol AProtocol
ARecord
(afn [this] 42))
Run Code Online (Sandbox Code Playgroud)第三个命名空间构造记录的实例并调用记录上的协议功能.
(ns defrecordissue.aot1
(:require [defrecordissue.aprotocol]
[defrecordissue.arecord]))
(defrecordissue.aprotocol/afn (defrecordissue.arecord/->ARecord))
Run Code Online (Sandbox Code Playgroud)编译defrecordissue.aot1命名空间时,在我使用的情况下
lein compile defrecordissue.aot1,编译失败,出现以下异常:
Exception in thread "main" java.lang.IllegalArgumentException: No implementation of method: :afn of protocol: #'defrecordissue.aprotocol/AProtocol found for class: defrecordissue.arecord.ARecord, compiling:(aot1.clj:5:1)
at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3463)
at clojure.lang.Compiler.compile1(Compiler.java:7153)
at clojure.lang.Compiler.compile(Compiler.java:7219)
at clojure.lang.RT.compile(RT.java:398)
at clojure.lang.RT.load(RT.java:438)
at clojure.lang.RT.load(RT.java:411)
at clojure.core$load$fn__5018.invoke(core.clj:5530)
at clojure.core$load.doInvoke(core.clj:5529)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invoke(core.clj:5336)
at clojure.core$compile$fn__5023.invoke(core.clj:5541)
at …Run Code Online (Sandbox Code Playgroud) clojure ×1