不同名称空间中的Clojurescript defprotocol和defrecord
这很好:不同名称空间中的Clojurescript defprotocol和defrecord,clojure,clojurescript,Clojure,Clojurescript,这很好: (ns ns1) (defprotocol P (foo [this a])) (defrecord Foo [attr] P (foo [this a] a)) (println (foo (Foo. "test") "Works!")) 但当我将协议移动到它自己的名称空间时,如下所示: (ns ns2) (defprotocol P (foo [this a])) 然后这会抛出一个使用未声明的var ns1/fo
(ns ns1)
(defprotocol P
(foo [this a]))
(defrecord Foo [attr]
P
(foo [this a] a))
(println (foo (Foo. "test") "Works!"))
但当我将协议移动到它自己的名称空间时,如下所示:
(ns ns2)
(defprotocol P
(foo [this a]))
然后这会抛出一个使用未声明的var ns1/foo
(ns ns1
(:require ns2 :refer [P]))
(defrecord Foo [attr]
P
(foo [this a] a))
(println (foo (Foo. "test") "Undeclared var?"))
我发现这篇文章写得很好,对Clojure和Java来说很有意义
可以让我上面的例子在clojurescript中工作吗
更新:我知道我错过了一些非常简单的东西!为了记录在案,正如公认的答案中所提到的:我所需要的只是引用foo
如下:
(ns ns1
(:require ns2 :refer [P foo]))
(defrecord Foo [attr]
P
(foo [this a] a))
(println (foo (Foo. "test") "Works once again"))
答案就在你链接的博文中。你必须
:引用你希望使用的协议函数(或者更明确地使用它们,就像现在的风格一样,使用:require:as
)。答案就在你链接的博客文章中。您必须:引用您希望使用的协议函数(或者更明确地使用它们,就像现在的样式一样,使用:require:as
)