不同命名空间中的 Clojurescript defprotocol 和 defrecord
Clojurescript defprotocol and defrecord in different namespaces
这很好用:
(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]))
然后抛出 Use of undeclared var ns1/foo
(ns ns1
(:require ns2 :refer [P]))
(defrecord Foo [attr]
P
(foo [this a] a))
(println (foo (Foo. "test") "Undeclared var?"))
我发现 this 写得很好,对 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"))
答案就在您链接的博客 post 中。您必须 :refer
您希望使用的协议功能(或者更明确地使用它们,就像现在的风格一样,使用 :require :as
)。
这很好用:
(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]))
然后抛出 Use of undeclared var ns1/foo
(ns ns1
(:require ns2 :refer [P]))
(defrecord Foo [attr]
P
(foo [this a] a))
(println (foo (Foo. "test") "Undeclared var?"))
我发现 this 写得很好,对 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"))
答案就在您链接的博客 post 中。您必须 :refer
您希望使用的协议功能(或者更明确地使用它们,就像现在的风格一样,使用 :require :as
)。