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)
タイプは単なる 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
ません。