【问题标题】:Clojure Map with # literal带有 # 字面量的 Clojure 映射
【发布时间】:2020-11-05 03:50:00
【问题描述】:

有什么区别

#:user{:profile{:name "Sally Clojurian"
                     :address {:city "Austin" :state "TX"}}}

{:user {:profile {:name "Sally Clojurian"
                  :address {:city "Austin" :state "TX"}}}}

我知道,如果我想获得名字,我可以这样做:

(get-in [:profile :name] map)

如何获得第一张地图的名称?

【问题讨论】:

  • (get-in [:profile :name] map) 无法获取名称。您是说上面示例中的 (get-in map [:user :profile :name] ) 吗?

标签: clojure


【解决方案1】:

打印以#:qualifer{ ... } 开头的映射的语法是当映射的所有键都是具有相同限定符或命名空间的关键字时打印的缩写形式。您可以在不使用该缩写的情况下使其打印,如下所示:

$ clojure
Clojure 1.10.1
user=> (def m1 #:user{:profile{:name "Sally Clojurian"
                     :address {:city "Austin" :state "TX"}}})
#'user/m1
user=> (pr m1)
#:user{:profile {:name "Sally Clojurian", :address {:city "Austin", :state "TX"}}}nil
user=> (doc *print-namespace-maps*)
-------------------------
clojure.core/*print-namespace-maps*
  *print-namespace-maps* controls whether the printer will print
  namespace map literal syntax. It defaults to false, but the REPL binds
  to true.
nil
user=> (binding [*print-namespace-maps* false] (pr m1))
{:user/profile {:name "Sally Clojurian", :address {:city "Austin", :state "TX"}}}nil

【讨论】:

    【解决方案2】:

    如果地图被定义为:

      (def myMap #:user{:profile{:name "Sally Clojurian"
                             :address {:city "Austin" :state "TX"}}})
    

    比起去profile name,你可以做类似的事情:

    (get-in map [:user/profile :name])
    

    【讨论】:

    • #:{} 是命名空间映射的语法。它为地图中的 keyword 键提供默认命名空间。请参考cljs.github.io/api/syntax/ns-map。它将澄清是否将此信息作为上下文放在上述响应中的示例之前。
    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多