Class 协议实现何时创建?
我很难理解Clojure中的协议是如何工作的。更具体地说,我认为我的问题与何时生成类有关(?) 我用下面这个简单的例子再现了我的问题。我有三个文件: core.cljClass 协议实现何时创建?,class,clojure,protocols,classloader,Class,Clojure,Protocols,Classloader,我很难理解Clojure中的协议是如何工作的。更具体地说,我认为我的问题与何时生成类有关(?) 我用下面这个简单的例子再现了我的问题。我有三个文件: core.clj (ns so.core (:require [so.soproto :refer :all]) (:import [so.soimpl AImpl]) ) (defn -main [] (println "Hello, World!")) (ns so.soproto) (defprotocol A (do-s
(ns so.core
(:require [so.soproto :refer :all])
(:import [so.soimpl AImpl])
)
(defn -main [] (println "Hello, World!"))
(ns so.soproto)
(defprotocol A
(do-smth [this]))
(ns so.soimpl
(:require [so.soproto :refer :all]))
(deftype AImpl
[]
A
(do-smth [this] (println "whatever")))
soproto.clj
(ns so.core
(:require [so.soproto :refer :all])
(:import [so.soimpl AImpl])
)
(defn -main [] (println "Hello, World!"))
(ns so.soproto)
(defprotocol A
(do-smth [this]))
(ns so.soimpl
(:require [so.soproto :refer :all]))
(deftype AImpl
[]
A
(do-smth [this] (println "whatever")))
soimpl.clj
(ns so.core
(:require [so.soproto :refer :all])
(:import [so.soimpl AImpl])
)
(defn -main [] (println "Hello, World!"))
(ns so.soproto)
(defprotocol A
(do-smth [this]))
(ns so.soimpl
(:require [so.soproto :refer :all]))
(deftype AImpl
[]
A
(do-smth [this] (println "whatever")))
现在,如果我尝试“lein run
”,我会得到以下结果:
$ lein run
Exception in thread "main" java.lang.ClassNotFoundException: so.soimpl.AImpl
我可以使用以下程序从Emacs复制问题:
- opencore.clj
- 叫Emacs的苹果酒杰克进来
- 将cider的REPL切换到名称空间so.core
- 苹果酒蒸发缓冲液
java.lang.ClassNotFoundException: so.soimpl.AImpl
现在,我可以通过执行以下操作从Emacs内部“修复”问题:
- 切换到缓冲区soimpl.clj
- 苹果酒蒸发缓冲液
- 切换回core.clj
- 苹果酒评估缓冲->现在一切正常
那么,我如何才能让“
lein run
”正常工作呢?我如何从cider/Emacs仅在core.clj上执行cider eval缓冲区,而不需要打开/评估包含协议实现的文件?如果要导入类,则需要先编译它。将:aot[so.soimpl]
添加到lein's project.clj中的defproject
选项中
但是,请注意,使用AImpl并不需要AOT编译/导入AImpl。只需在其构造函数中引用
(:导入[so.soimpl AImpl])
(需要[so.soimpl:参考(->AImpl)])
查看此最新版本。请编辑我的问题以修复术语错误:)谢谢您的帮助。。。我不熟悉require:reference中的“dash/superior”->thinngy。它与“引用:全部”有什么不同?(假设AImpl是我在so.soimpl中声明的唯一内容)->AImpl
只是在so.soimpl
命名空间中执行(deftype AImpl…
时自动为您创建的工厂函数。