gpt4 book ai didi

map 及其值的 clojure 规范

转载 作者:行者123 更新时间:2023-12-01 00:36:40 25 4
gpt4 key购买 nike

我正在使用 Clojure 来实现(书面)标准文档。总的来说,我对 Clojure 允许我编写符合标准不同部分的代码的方式感到满意。着眼于 future ,我正在尝试写一个 clojure.spec为了它。在文档中,他们定义了具有命名字段的各种结构化数据元素。然而,不同结构中的字段具有相同的名称,例如“红色”结构具有一个字符串形式的“值”字段,而“蓝色”结构具有一个整数形式的“值”字段。在编写规范时我该如何处理?

(s/def ::value ???)
(s/def ::red (s/keys :req [::value ...]))
(s/def ::blue (s/keys :req [::value ...]))

official advice ,据我所知,命名键在任何地方都应该具有相同的语义。

我应该如何处理这个问题?我可以称它们为“红色值”和“蓝色值”,但这使得代码和标准之间的对应关系不太清楚。我可以将每个结构放在自己的命名空间中吗?

最佳答案

您的示例将当前命名空间用于所有规范名称,但您应该利用命名空间来消除名称的歧义。

(s/def ::red (s/keys :req [:red/value ...]))
(s/def ::blue (s/keys :req [:blue/value ...]))

您可以将这些规范与 map 一起使用,例如:
(s/valid? ::red {:red/value "foo"})
(s/valid? ::blue {:blue/value 100})

此外, s/keys支持 :req-un将命名规范链接到非限定属性名称的选项,如果这是您必须使用的。
(s/def ::red (s/keys :req-un [:red/value ...]))
(s/def ::blue (s/keys :req-un [:blue/value ...]))

您可以使用以下值进行验证:
(s/valid? ::red {:value "foo"})
(s/valid? ::blue {:value 100})

关于 map 及其值的 clojure 规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40586561/

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