在不同命名空间中的单独文件中实现多方法

时间:2016-07-12 06:13:19

标签: clojure polymorphism multimethod

我试图在一个单独的文件中定义一个多方法及其实现。它是这样的: 在文件1中

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

在档案2中

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

在我调用方法的主文件中,我定义了这样的内容:

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

当我这样做时,我得到一个例外"No method in multimethod 'foo'for dispatch value: hello

我做错了什么?或者是不可能在单独的文件中定义多方法的实现?

1 个答案:

答案 0 :(得分:5)

有可能。问题是因为thing.a.b.c命名空间没有被加载。你必须在使用前加载它。

这是一个正确的例子:

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

(test/foo "hello")