我想在 Clojure 中创建一个仅在当前命名空间中可见的类型。
有一个类型my-type
定义在my.ns
(ns my.ns)
(deftype my-type
Protocol
(some-function[]))
如何避免通常的导入策略,将类型设为私有?
(ns other.ns
(:import my.ns.my-type)
(->my-type)
我想在 Clojure 中创建一个仅在当前命名空间中可见的类型。
有一个类型my-type
定义在my.ns
(ns my.ns)
(deftype my-type
Protocol
(some-function[]))
如何避免通常的导入策略,将类型设为私有?
(ns other.ns
(:import my.ns.my-type)
(->my-type)
你不能阻止你的类型被导入,因为它们只是公共类。您可以像这样将工厂函数设为私有:
(deftype Foo [])
(alter-meta! #'->Foo assoc :private true)
对于完全隐藏的“类型”,您可以reify
在私有工厂函数中使用:
(defn ^:private make-foo [& args]
(reify SomeProtocol
(method1 [this] ...)))
这里的一个潜在问题是您将无法使用extend-type
和类似来增加这样的“类型”。
另一方面,协议可以设为私有,但需要注意的是其随附的接口仍将是公开的:
(defprotocol ^:private PFoo
(^:private foo [this]))
:private
协议 Var 和各个方法都需要元数据,因为它们接收自己单独的 Var。有了上述内容,接口some.ns.PFoo
仍然是公共的,但协议some.ns/PFoo
不会。