繁体   English   中英

如何在Lein项目中设置课程?

[英]How do I set up classes in a Lein project?

我运行了lein new app hm ,然后在hm/src/hm core.clj编辑为:

(ns hm.core
  (:gen-class)
  (:use [hm.hashmap]))

(defn -main []
  (def j (new hm.hashmap))
  (-add j "foo" "bar")
  (println j))

hashmap.clj为:

(ns hm.hashmap
  (:gen-class
   :methods [[hashmap [] java.util.HashMap]
             [add [String String]]]))

(defn -hashmap []
  (def h (new java.util.HashMap))
  h)

(defn -add [this key value]
  (. this put key value)
  this)

目的是围绕HashMap进行包装,以便我了解Clojure及其与Java的关系。 我对Clojure很陌生。 但是,当我对此进行编译时,在hashmap.clj得到了很多ClassNotFoundException。 我该如何进行这项工作?

注意:这是您问题的直接答案。 我不建议您这样学习Clojure。


您需要先编译类,然后才能运行它们。 在您的project.clj中,将此添加到地图中:

:aot [hm.hashmap]

然后,您需要运行lein compile才能编译类。 您应该看到输出说hm.hashmap类已编译。 该运行后lein run调用中的“主要”功能hm.core

我删除了gen-class的:methods部分,因为您已经在下面定义它们了,这导致了奇怪的java.lang.,错误。 您将遇到其他错误,但这足以使您通过此问题。

您的代码还有其他问题,但是直接的问题是add的签名不完整。 add回到this ,一个hm.hashmap

要解决此问题,请更改签名以返回Object ,或者进行其他编辑以返回java.util.HashMap 如果您希望此方法以其他方式工作,则还需要扩展而不是封装。

(ns hm.hashmap
  (:gen-class
   :extends java.util.HashMap
   :methods [[add [String String] java.util.HashMap]]))

最后改变-maincore.clj使用要调用的方法.add ,而不是试图访问私有-add

...
(.add j "foo" "bar")
...

然后

lein clean
lein compile hm.core hm.hashmap
lein run

应该打印

#<hashmap {foo=bar}>

请注意,据我所知,由于符号解析的时间安排,您不能指定在签名中返回hm.hashmap 请参阅GC问题81:当class返回self时,编译gen-class失败

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM