继有关解释:gen-class中的解剖学gen-class,我用leiningen得到的类文件.
leon new pinger 创建一个项目.cd src并在其中mkdir some创建了一个Example.clj文件.:aot [some.Example](或:aot :all)project.clj.Example.clj如下:
(ns some.Example
(:gen-class))
(defn -toString
[this]
"Hello, World!")
Run Code Online (Sandbox Code Playgroud)
然后我执行lein compile以获取target目录中的类.
然后,我正在执行此代码lein repl.
(-toString (some.Example.)) ; should return "Hello, World!"
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误消息.
CompilerException java.lang.RuntimeException: Unable to resolve symbol:
-toString in this context, compiling:(/private/var/folders/nw/dmb7jh3d2hq89296z2gnntqm0000gn/T/form-
init7145760420048735997.clj:1:1)
Run Code Online (Sandbox Code Playgroud)
.toString 工作良好.
user=> (.toString (some.Example.))
"Hello, World!"
Run Code Online (Sandbox Code Playgroud)
该网站解释说,我应该从两个相同的结果-toString和.toString,但我只能用正确的结果.toString.
Clojure -toString和.toStringClojure有什么区别?为什么-toString在示例中引发错误?
首先,一些术语:
(.toString (some.Example.))是toString对新构造的some.Example实例的方法的调用.
(-toString (some.Example.))是一个常规的Clojure函数调用,它-toString是一个存储函数并(some.Example.)作为唯一参数的Clojure Var的名称.
:gen-class安排事情,以便-toStringVar支持toString方法; 也就是说,toString对some.Example实例方法的任何调用都会导致调用-toString.所以确实只是-toString直接调用是等价的.
但是,在通过引用存储它的Var来调用Clojure函数之前,需要确保已经加载了这个Var所在的命名空间(这里没有问题,因为你能够构造一个实例)some.Example),然后要么是指通过其完全限定名称的VAR,或者使用refer,use,require或alias使其能够通过较短的名称引用它:
(some.Example/-toString ...)
(use '[some.Example :only [-toString]])
(-toString ...)
(require '[some.Example :refer [-toString]])
(-toString ...)
(require '[some.Example :as se])
(se/-toString ...)
;; refer and alias are typically not used directly
Run Code Online (Sandbox Code Playgroud)
如果你说-toString没有首先使用refer,use或者require如上所示1,Clojure将尝试将符号解析-toString为当前命名空间中的Var(通常user在REPL会话中; lein repl它可能是表单中的:main命名空间defproject).
1这是关于REPL的.在源文件中,您通常使用:use或:require在您的ns表单中; 语法与for use/ requireminus引用相同.