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

标签 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
我究竟做错了什么?或者无法在单独的文件中定义多方法的实现?

最佳答案

有可能的。问题是因为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")

关于clojure - 在不同命名空间的不同文件中实现多方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38321212/

相关文章:

oop - Perl 6 多方法从不匹配预期的签名

clojure - 多方法的通用语法

scala - 什么是 "polymorphism a la carte"以及我如何从中受益?

c++ - 动态转换如何工作?

inheritance - eclipselink/Moxy : inheritance and attribute name oveloading based on type

namespaces - 命名空间有什么用?用法呢?

clojure - 在 Cursive REPL 中查看堆栈跟踪

Clojure:::标签的含义

clojure - 为什么我可以在 clojure 中使用集合作为谓词?

c++ - 多态队列