我创建了一个这样的记录:
(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中导入它.
我在这里写了一段时间:
MAG*_*Gx2 11
如果你-的名字空间中有(破折号),那可能会非常棘手.
事实证明有两个错误:
- 从另一个命名空间导入defrecord不仅仅是:使用.我必须先:要求命名空间,然后导入defrecord.这是一个需要解决的微不足道的问题,我很快就明白了.只有这个在我的情况下不起作用
- 由于我们将Lisp与Java混合,所以Dashes" - "和Underscores"_"是令人讨厌的.虽然文件系统使用下划线,但Clojure会将内容转换为破折号.辉煌.
因此,为了修复第二个错误,我使用ns块中的follow
Run Code Online (Sandbox Code Playgroud)(ns adder.core (:require building-blocks.activity) (:import [building_blocks.activity Activity]))
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产生的构造函数(在这里,他们会被命名为->User和map->User).这些函数允许您避免互操作形式,只需在构造函数中引用,就像任何其他函数一样.通过避免互操作,这是一个更便携,更少的解决方案:
(ns some-ns
(:require [oe.model.modelcore :refer (->User)]))
(def user (->User "name" "email"))
Run Code Online (Sandbox Code Playgroud)