Clojure - 相同的函数名称不同的命名空间

Clojure - same function name different namespace

我正在尝试执行以下操作:

(ns ns-test.core
  (:use [ns-test.a :as a]
    [ns-test.b :as b]))

(def test-map {:key "a"})

(defmulti print-ns :key)
(defmethod print-ns "a" [input-map]
  (a/foo input-map))
(defmethod print-ns "b" [input-map]
  (b/foo input-map))

名称空间 a 和 b 如下所示:

(ns ns-test.a)

(defn foo [x]
  (println x "I'm in namespace A."))

(ns ns-test.b)

(defn foo [x]
  (println x "I'm in namespace B."))

但是当我尝试将这些 类 加载到 REPL 中时,我得到了这个:

user=> (use 'ns-test.core :reload)

CompilerException java.lang.IllegalStateException: foo already refers to: #'ns-test.a/foo in namespace: ns-test.core, compiling:(ns_test/core.clj:1:1) 

为什么 a/foo 和 b/foo 之间存在这种冲突,我该如何预防? (命名空间和命名空间限定的全部意义不就是让我拥有两个同名的不同函数吗?)

您可能想要 :require 命名空间 ab 而不是 :use:use 将命名空间符号实习到当前命名空间,因此发生冲突。