无法导入clojure记录

Zub*_*air 13 clojure

我创建了一个这样的记录:

(defrecord User [user-id email])
Run Code Online (Sandbox Code Playgroud)

:但是当我尝试从另一个名称空间访问它时,我收到错误:

(User. "name" "email")
Run Code Online (Sandbox Code Playgroud)

java.lang.IllegalArgumentException:无法解析类名:User

它适用于我:

(oe.model.modelcore.User. "name" "email")
Run Code Online (Sandbox Code Playgroud)

:我知道我需要导入Java类,但是当我这样做时,clojure有没有办法自动执行此操作:

(use 'oe.model.modelcore :reload)
Run Code Online (Sandbox Code Playgroud)

Ale*_*ler 13

从技术上讲,您必须要求它(不一定需要使用它),以便编译包含记录定义的文件并创建类.然后,您必须导入它,以便可以构造为Java类.如果你在第一个ns中创建一个构造函数

(defn new-user [id email] 
  (User. id email))
Run Code Online (Sandbox Code Playgroud)

那么你不需要在调用ns中导入它.

我在这里写了一段时间:

  • 值得庆幸的是,从Clojure 1.3开始就没有必要了,其中记录成为一等公民.只是希望对现在阅读此内容的人发表评论. (3认同)

MAG*_*Gx2 11

如果你-的名字空间中有(破折号),那可能会非常棘手.

事实证明有两个错误:

- 从另一个命名空间导入defrecord不仅仅是:使用.我必须先:要求命名空间,然后导入defrecord.这是一个需要解决的微不足道的问题,我很快就明白了.只有这个在我的情况下不起作用

- 由于我们将Lisp与Java混合,所以Dashes" - "和Underscores"_"是令人讨厌的.虽然文件系统使用下划线,但Clojure会将内容转换为破折号.辉煌.

因此,为了修复第二个错误,我使用ns块中的follow

(ns adder.core
    (:require building-blocks.activity)
    (:import [building_blocks.activity Activity]))
Run Code Online (Sandbox Code Playgroud)

https://cyrax.wordpress.com/2013/07/22/clojure-importrequireuse-defrecord-from-another-namespace/


Ale*_*sky 10

你必须导入这样的记录:

(ns some-ns
  (:import [oe.model.modelcore User]))
Run Code Online (Sandbox Code Playgroud)


Ale*_*ler 10

在您的问题中,您正在创建一个记录,然后调用作为副作用生成的类的构造函数.为此,您需要导入另一个答案中提到的该类.

但是,恕我直言首选路径(因为Clojure的1.4)是使用由defrecord产生的构造函数(在这里,他们会被命名为->Usermap->User).这些函数允许您避免互操作形式,只需在构造函数中引用,就像任何其他函数一样.通过避免互操作,这是一个更便携,更少的解决方案:

(ns some-ns 
  (:require [oe.model.modelcore :refer (->User)]))

(def user (->User "name" "email"))
Run Code Online (Sandbox Code Playgroud)