代码之家  ›  专栏  ›  技术社区  ›  user3139545

在Clojure中嵌套地图的惯用方法是什么

  •  1
  • user3139545  · 技术社区  · 5 年前

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

    从Clojure 1.9开始,甚至支持 Map namespace syntax 使备选方案2变得非常简单。

    0 回复  |  直到 5 年前
        1
  •  3
  •   danp    5 年前

    您似乎混淆了嵌套映射(字面意思是,映射作为键的值)和名称空间键,后者仍然只是关键字,但具有一些魔力。名称空间键到值的映射仍然只是一个级别的映射。

    你可以看看官员 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.
    

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