Pregunta

Tengo un proyecto creado con Leiningen llamada techne. He creado un módulo llamado frote con un tipo, que se llama Scrub y una función llamada 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)))) 

Al ejecutar la prueba, me sale el error:

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)

Si quito prueba de matorrales todo funciona bien. ¿Por qué: el uso techne.scrub 'importar' las definiciones de funciones, pero no las definiciones de tipos? ¿Cómo me refiero las definiciones de tipos?

¿Fue útil?

Solución

DEFTYPE genera una clase, es probable que necesite importar que clase de Java en techne.scrub-test con (: importación [techne.scrub Scrub]) en su definición ns.

De hecho, me escribió esta misma cosa con respecto a defrecord aquí:

Otra cosa que podría hacer sería definir una función constructora en el matorral:

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

y entonces no tendría que importar Scrub en prueba-exfoliante.

Otros consejos

agrego la importación, pero consigo el mismo problema. Estoy probando con las expectativas empaquetar 2.0.9, tratando de DEFTYPE importación de nodo y la interfaz de nodo-i.

En 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) _))

En 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]))

y la salida del autoexpect Lein:

*************** 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

La sugerencia de utilizar un método de fábrica, sin embargo, es un trabajo en torno viable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top