小编Rag*_*gge的帖子

与记录,协议和编译相关的令人惊讶的行为

对我来说,我遇到了一个看似与clojure记录有关的略微令人惊讶的行为.

设置如下:

  1. 一个名称空间定义记录类型:

    (ns defrecordissue.arecord)
    
    (defrecord ARecord [])
    
    Run Code Online (Sandbox Code Playgroud)
  2. 另一个命名空间定义了一个协议,并将其扩展为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)
  3. 第三个命名空间构造记录的实例并调用记录上的协议功能.

    (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

11
推荐指数
1
解决办法
476
查看次数

标签 统计

clojure ×1