3

我想在 Clojure 中创建一个仅在当前命名空间中可见的类型。

有一个类型my-type定义在my.ns

(ns my.ns)

(deftype my-type
  Protocol
  (some-function[]))

如何避免通常的导入策略,将类型设为私有?

(ns other.ns
  (:import my.ns.my-type)

(->my-type)
4

1 回答 1

1

你不能阻止你的类型被导入,因为它们只是公共类。您可以像这样将工厂函数设为私有:

(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不会。

于 2013-04-07T00:59:06.433 回答