gpt4 book ai didi

data-structures - 在 Clojure 中嵌套 map 的惯用方法是什么

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

在阅读 Clojure 代码时,我看到了 2 种不同的映射结构模式:

;; 1.
(def event {:type :created :data {:start 1}})
;; 2.
(def event {:event/type :created :data/start 1})

甚至从 Clojure 1.9 开始就支持 Map namespace syntax使替代方案 2 非常易于使用。

我的问题是每种用法背后的原因是什么(优点/缺点),是否有任何谈话/文章解释了如何在 Clojure 中构建映射背后的更深层次的想法?

最佳答案

您似乎将嵌套映射(字面意思是映射作为键的值)与命名空间键混淆,命名空间键仍然只是关键字,但具有一些神奇的力量。命名空间键到值的映射仍然只是一个单级映射。

你可能想看看官方namespaced keyword destructuring example为了深入了解它们常用的一种方式 - 线索就在名称中,因为它们似乎旨在将键分组到语义相关的组中,无论这对应于代码中的实际命名空间,还是是您即时发明的完全转瞬即逝的东西,由您决定。

它们的一个非常巧妙的特性是能够为命名空间关键字设置别名 - 因此,如果您需要一个命名空间,那么您的本地别名可以引用相同的关键字 - 即:

(ns foo.bar
(:require [foo.baz :as baz]))

(prn ::baz/yours) ; equivalent to :foo.baz/yours
(prn ::mine) ; equivalent to :foo.bar/mine

(defn formatted-name [{:baz/keys [yours]}]
(str "hi:" yours))

(prn (formatted-name {::baz/yours "clojurian!"}))
(prn (formatted-name {:foo.bar/yours "also"})) ; same arguments, but previous isn't hardcoded.

这绝对是您经常看到的东西,尤其是在较大的代码库中,并且对组织有很大帮助。

关于data-structures - 在 Clojure 中嵌套 map 的惯用方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57228584/

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