Как вы используете тип за пределами собственного пространства имен в Clojure?

StackOverflow https://stackoverflow.com/questions/3690784

Вопрос

У меня есть проект, созданный с Лейнингеном под названием Techne. Я создал модуль под названием Scrub с типом в нем под названием Scrub и функция под названием Foo.

Techne / Scrub.clj:

(ns techne.scrub)
  (deftype Scrub [state]
    Object
     (toString [this]
     (str "SCRUB: " state)))

(defn foo
  [item]
  (Scrub. "foo")
  "bar")

Techne / scrub_test.clj:

(ns techne.scrub-test                                                                                                                                             
  (:use [techne.scrub] :reload-all)                                                                                                                               
  (:use [clojure.test]))                                                                                                                                          


(deftest test-foo                                                                                                                                                 
  (is (= "bar" (foo "foo"))))                                                                                                                                                           

(deftest test-scrub                                                                                                                                               
  (is (= (Scrub. :a) (Scrub. :a)))) 

Когда я бегу тест, я получаю ошибку:

Exception in thread "main" java.lang.IllegalArgumentException: Unable to resolve    classname: Scrub (scrub_test.clj:11)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:5376)
    at clojure.lang.Compiler.analyze(Compiler.java:5190)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:5357)

Если я удалю тест-скраб, все работает нормально. Почему используйте Teash.scrub 'Import' определения функций, но не определения типа? Как ссылаться на определения типа?

Это было полезно?

Решение

Потому что дефтип Создает класс, вам, вероятно, нужно будет импортировать этот класс Java в Techne.scrub-Test с (: Import [Techne.scrub Scrub]) в определении NS.

Я на самом деле записал это же в отношении Defrecord здесь:

Еще одна вещь, которую вы могли бы сделать, бы определить функцию конструктора в Scrub:

(defn new-scrub [state] 
  (Scrub. state))

И тогда вам не нужно импортировать скраб в Test-Scrub.

Другие советы

Я добавляю импорт, но получаю ту же проблему. Я тестируюсь с пакетом ожиданий 2.0.9, пытаясь импортировать узел deftype и inode интерфейса.

В Core.clj:

(ns linked-list.core)

(definterface INode
  (getCar [])
  (getCdr [])
  (setCar [x])
  (setCdr [x]))

(deftype Node [^:volatile-mutable car ^:volatile-mutable cdr]
  INode
  (getCar[_] car)
  (getCdr[_] cdr)
  (setCar[_ x] (set! car x) _)
  (setCdr[_ x] (set! cdr x) _))

В Core_test.clj:

(ns linked-list.core-test
  (:require [expectations :refer :all]
            [linked-list.core :refer :all])
  (:import [linked-list.core INode]
           [linked-list.core Node]))

И вывод из Lein AutoExpect:

*************** Running tests ***************
Error refreshing environment: java.lang.ClassNotFoundException: linked-list.core.INode, compiling:(linked_list/core_test.clj:1:1)
Tests completed at 07:29:36.252

Однако предложение использовать фабричный метод, является жизнеспособной работой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top