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

タイプは単なる public クラスであるため、タイプがインポートされるのを防ぐことはできません。次のように、ファクトリ関数を非公開にすることができます。

(deftype Foo [])

(alter-meta! #'->Foo assoc :private true)

完全に隠された「タイプ」の場合reify、プライベート ファクトリ関数で使用できます。

(defn ^:private make-foo [& args]
  (reify SomeProtocol
    (method1 [this] ...)))

extend-typeここでの潜在的な問題の 1 つは、そのような「型」を拡張するために and similar を使用できないことです。

一方、プロトコルはプライベートにすることができますが、付随するインターフェースは引き続きパブリックになるという注意事項があります。

(defprotocol ^:private PFoo
  (^:private foo [this]))

:privateメタデータは、プロトコル Var と個々のメソッドの両方で必要です。これらは独自の個別の Var を受け取るためです。上記の設定を行っても、インターフェイスsome.ns.PFooは引き続き公開されますが、プロトコルは公開されsome.ns/PFooません。

于 2013-04-07T00:59:06.433 に答える