加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Clojure中-toString与.toString的区别

发布时间:2020-12-15 04:17:27 所属栏目:Java 来源:网络整理
导读:在关于 The Anatomy of gen-class 的gen-class的解释之后,我使用leiningen来获取类文件. leon new pinger创建一个项目. cd src和mkdir some并在其中创建了一个Example.clj文件. 已添加:在project.clj中有一个[some.Example](或:aot:all). Example.clj如下
在关于 The Anatomy of gen-class的gen-class的解释之后,我使用leiningen来获取类文件.

> leon new pinger创建一个项目.
> cd src和mkdir some并在其中创建了一个Example.clj文件.
>已添加:在project.clj中有一个[some.Example](或:aot:all).

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方法的调用.
>(-toString(some.Example.))是一个常规的Clojure函数调用,-toString是存储函数的Clojure Var的名称,而(some.Example.)是它的唯一参数.

: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减去引用相同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读