2016-07-12 1 views
2

J'essaie de définir un multiméthode et son implémentation dans un fichier séparé. Il ressemble à ceci: Dans le fichier 1Implémentation d'un multiméthode dans des fichiers distincts dans un espace de nom différent

(ns thing.a.b) 
(defn dispatch-fn [x] x) 
(defmulti foo dispatch-fn) 

Dans le fichier 2

(ns thing.a.b.c 
    (:require [thing.a.b :refer [foo]]) 
(defmethod foo "hello" [s] s) 
(defmethod foo "goodbye" [s] "TATA") 

Et dans le fichier principal quand je fais appel à la méthode que je définir quelque chose comme ceci:

(ns thing.a.e 
    (:require thing.a.b :as test)) 
. 
. 
. 
(test/foo "hello") 

Lorsque je fais cela, je reçois une exception en disant "No method in multimethod 'foo'for dispatch value: hello

Qu'est-ce que je fais de mal? Ou n'est-il pas possible de définir des implémentations de multiméthodes dans des fichiers séparés?

Répondre

4

C'est possible. Le problème est que l'espace de noms thing.a.b.c n'est pas chargé. Vous devez le charger avant de l'utiliser.

Ceci est un exemple correct:

(ns thing.a.e 
    (:require 
    [thing.a.b.c] ; Here all your defmethods loaded 
    [thing.a.b :as test])) 

(test/foo "hello")