gpt4 book ai didi

Clojure:列出在命名空间内实现某些协议(protocol)的所有定义类型

转载 作者:行者123 更新时间:2023-12-04 04:35:25 26 4
gpt4 key购买 nike

我有一个协议(protocol)和几个在一个工作区中实现它的定义类型。如何列出实现以下协议(protocol)的所有定义类型?

我已经找到了从(ns-public)过滤数据的解决方案,但我不喜欢它,因为它使用一些“魔法”来完成工作,因为我还没有找到实现目标的正确方法满足?并扩展?

有任何想法吗?

(defprotocol Protocol
(foo[this] "just an interface method"))


(deftype Dummy [] Protocol
(foo[this] "bar"))


(defn implements? [protocol atype] "fn from clojure sources"
(and atype (.isAssignableFrom ^Class (:on-interface protocol) atype)))


(defn list-types-implementing[protocol]
(filter (fn[x] (let [[a b] x]
(when (.startsWith (str a) "->") ; dark magic
(implements? protocol
(resolve (symbol
(.replace (str a) "->" "")))))
))
(ns-publics *ns*)))

(list-types-implementing Protocol) ; => ([->Dummy #'user/->Dummy])

(let [[a b] (first(list-types-implementing Protocol))]
(foo (b)) ; => "bar"
)

最佳答案

一般来说,这将是一个需要解决的棘手问题,因为一个类型可以通过两种不同的方式满足协议(protocol)。您可以使用 extend-type 将任何现有的 Java 类扩展为协议(protocol)。和 extend-protocol函数(这是一个非常强大的特性,因为它允许您扩展代码以使用内置 Java 或 Clojure 类型,或您无法控制的其他第三方类型)。或者,您可以将协议(protocol)实现直接指定为 deftype 中的类型定义的一部分。或 defrecord .这两种机制的实现方式不同。

第一种情况(通过 extend-typeextend-protocol 扩展)将更容易解决,因为被扩展的类型将附加到协议(protocol)本身(协议(protocol)本质上相当于生成的 Java 接口(interface)加上 Clojure映射有关协议(protocol)的元数据)。您可以通过查看 :impls 找到扩展协议(protocol)的类型。协议(protocol)映射中的键:

user=> (defprotocol MyProtocol (foo [this] "Protocol function"))
user=> (deftype MyType [])
user=> (extend-type MyType MyProtocol (foo [_] "hello foo!"))
user=> (keys (:impls MyProtocol))
(user.MyType)

第二种情况(通过 deftypedefrecord 直接实现协议(protocol))更困难,因为发生的是为类型或记录生成的 Java 类将直接实现协议(protocol)定义的 Java 接口(interface)(您可以实现任何 Java 接口(interface)在 deftypedefrecord 中,而不仅仅是协议(protocol))。任何找到以这种方式扩展协议(protocol)的类型的方法都需要一些扫描和反射。基本上你要问的是,“我怎样才能找到实现给定接口(interface)的所有 Java 类?”

在典型的 Java 应用程序中,您可能会按照扫描类路径的目录以查找 .class 文件并对其进行自省(introspection)的方式执行某些操作,但这在 Clojure 中不起作用,因为您的类型很可能没有 .class 文件(字节码是动态生成的)。如果您对自己的实现不满意,您可以查看此问题中的答案,看看它是否更符合您的喜好:

Find Java classes implementing an interface

关于Clojure:列出在命名空间内实现某些协议(protocol)的所有定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14246945/

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