gpt4 book ai didi

clojure - 为 Clojure 协议(protocol)提供多种实现

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

我有一个命名空间,它公开了常见的数据相关函数( get-imagesinsert-user )。然后我有两个数据库后端,它们具有相同的功能并以不同的方式实现它们。他们按原样实现接口(interface)。每个后端都包含在一个命名空间中。

我似乎无法找到一个很好的解决方案来解决这个问题。

我尝试动态加载 ns但没有运气。一旦你这样做了(:require [abc :as x]) , x不是真正的值(value)。

我尝试使用 defprotocoldeftype但这很奇怪,因为 deftype 中的函数也需要导入,这对我来说一切都搞砸了。

有一些惯用的解决方案吗?

最佳答案

我不明白为什么协议(protocol)不够?

在 ns data.api 中:

(ns data.api)
(defprotocol DB
(get-images [this])
(insert-user [this]))

在 ns data.impl1 中:
(ns data.impl1
(:require [data.api :refer :all]))

(defrecord Database1 [connection-params]
DB
(get-images [_] ...)
(insert-user [_] ...))

在 ns data.impl2 中也是一样的。

然后,当您使用特定数据库时,只需创建正确的记录:
(ns data.user
(:require [data.api :refer :all])
[data.impl1 :refer (->Database1)])

(defn use-db []
(let [db1 (->Database1 {})]
(get-images db1)))

关于clojure - 为 Clojure 协议(protocol)提供多种实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22257238/

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