gpt4 book ai didi

clojure - 如何在 Clojure 中创建本地类型?

转载 作者:行者123 更新时间:2023-12-02 03:47:44 25 4
gpt4 key购买 nike

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

my.ns 中定义了类型 my-type

(ns my.ns)

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

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

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

(->my-type)

最佳答案

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

(deftype Foo [])

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

对于完全隐藏的“类型”,您可以在私有(private)工厂函数中使用reify:

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

这里的一个潜在问题是您将无法使用 extend-type 和类似的方法来扩充这样的“类型”。

另一方面,协议(protocol)可以设为私有(private),但需要注意的是它们的相关接口(interface)仍将是公共(public)的:

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

:private 协议(protocol) Var 和各个方法都需要元数据,因为它们接收自己单独的 Var。有了上面的内容,接口(interface) some.ns.PFoo 仍然是公开的,但是协议(protocol) some.ns/PFoo 不会。

关于clojure - 如何在 Clojure 中创建本地类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15856805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com