Не могу импортировать записи clojure - PullRequest
13 голосов
/ 02 января 2011

Я создал такую ​​запись:

(defrecord User [user-id email])

: но когда я пытаюсь получить доступ к нему из другого пространства имен, я получаю сообщение об ошибке:

(User. "name" "email")

java.lang.IllegalArgumentException: невозможно разрешить имя класса: пользователь

Это работает, когда я делаю:

(oe.model.modelcore.User. "name" "email")

: я знаю, что мне нужно будет импортировать класс Java, но есть ли способ для clojure сделать это автоматически, когда я сделаю:

(use 'oe.model.modelcore :reload)

Ответы [ 4 ]

13 голосов
/ 03 января 2011

Технически это необходимо (не обязательно использовать), чтобы файл, содержащий определение записи, был скомпилирован и создан класс. Затем вы должны импортировать его, чтобы он был доступен для конструирования как класс Java. Если вы создаете функцию конструктора в первых ns, таких как

(defn new-user [id email] 
  (User. id email))

тогда вам не нужно будет импортировать его в вызывающую нс.

Я написал это здесь некоторое время назад:

11 голосов
/ 20 октября 2015

Это может быть очень сложно, если у вас есть - (тире) в вашем пространстве имен.

Как выяснилось, было две ошибки:

- импорт defrecord fromдругое пространство имен не просто: используйте.Я должен был сначала: потребовать пространство имен, а затем импортировать defrecord.Это была тривиальная проблема, и я быстро понял ее.Только это не сработало в моем случае

- тире «-» и подчеркивание «_» являются неприятностью, поскольку мы смешиваем Lisp с Java.В то время как файловая система использует подчеркивания, Clojure преобразует вещи в тире.Brilliant.

Итак, чтобы исправить вторую ошибку, я использую следующую команду в блоке ns

(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/

10 голосов
/ 11 июля 2014

В вашем вопросе вы создаете запись, затем вызываете конструктор для класса, сгенерированного как побочный эффект. Для этого вам нужно импортировать этот класс, как указано в другом ответе.

Тем не менее, imho предпочтительный путь (начиная с Clojure 1.4) - использовать функции конструктора, сгенерированные defrecord (здесь они будут называться ->User и map->User). Эти функции позволяют вам избегать форм взаимодействия и просто ссылаются на функции конструктора, как и любая другая функция. Избегая взаимодействия, это более переносимое и менее хостовое решение:

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

(def user (->User "name" "email"))
10 голосов
/ 03 января 2011

Вы должны импортировать запись следующим образом:

(ns some-ns
  (:import [oe.model.modelcore User]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...