java – Clojure中-toString与.toString的区别
在关于
The Anatomy of
gen-class 的gen-class的解释之后,我使用leiningen来获取类文件.
> leon new pinger创建一个项目. Example.clj如下: (ns some.Example (:gen-class)) (defn -toString [this] "Hello,World!") 然后我执行lein编译以获取目标目录中的类. 然后,我用lein repl执行这段代码. (-toString (some.Example.)) ; should return "Hello,World!" 但是,我收到此错误消息. CompilerException java.lang.RuntimeException: Unable to resolve symbol: -toString in this context,compiling:(/private/var/folders/nw/dmb7jh3d2hq89296z2gnntqm0000gn/T/form- init7145760420048735997.clj:1:1) .toString工作正常. user=> (.toString (some.Example.)) "Hello,World!" 该网站解释说我应该从-toString和.toString获得相同的结果,但我只得到.toString的正确结果. Clojure中-toString和.toString有什么区别?为什么-toString会在示例中引发错误? 解决方法
首先,一些术语:
>(.toString(some.Example.))是对新构造的some.Example实例的toString方法的调用. :gen-class排列事物,以便-toString Var支持toString方法;也就是说,对some.Example实例的toString方法的任何调用都会导致对-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 如果你说-toString没有先使用refer,使用或者需要如上所示1,Clojure将尝试将符号-toString解析为当前命名空间中的Var(通常是REPL会话中的用户;使用lein repl,它可能是:main命名空间来自你的defproject表格). 1这是关于REPL的.在源文件中,您通常在ns表单中使用:use或:require;语法与use / require减去引用相同. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |