这是有效的:
{:a :v (if true :f) :r }
这不是
{:a :v (if true {:f :r}) }
因为它想在结构中放置一个新的hashmap
我需要在if
中返回一个特殊的结构(我已经忘记了它的名字)
它包含键和值,因此它被插入到哈希映射中。
由于
答案 0 :(得分:3)
这是你需要的吗?
(merge {:a :v} (if true {:f :r}))
=> {:f :r, :a :v}
答案 1 :(得分:3)
第二种情况失败不是因为if
表单返回了错误类型的值,而是因为地图包含奇数个项目。地图文字必须包含偶数个表单,if
是单个表单。
有几种方法可以在Clojure中向地图添加内容。
您可以将conj
与vector或map参数一起使用:
(conj {:a :v} [:f :r]) ;;=> {:f :r, :a :v}
(conj {:a :v} {:f :r}) ;;=> {:f :r, :a :v}
您可以将assoc
与key和val一起用作单独的参数:
(assoc {:a :v} :f :r) ;;=> {:f :r, :a :v}
或者您可以将merge
与两个(或更多)地图一起用作参数:
(merge {:a :v} {:f :r}) ;;=> {:f :r, :a :v}
您正在考虑的特殊结构可能是MapEntry
。这就是通过在地图上调用seq
创建的seq中的项目。
例如:
(seq a-map) ;;=> ([:a :v] [:f :r])
(first (seq a-map)) ;;=> [:a :v]
(-> a-map seq first class) ;;=> clojure.lang.MapEntry
地图条目的外观和行为就像矢量一样,只需添加一个。您可以使用key
和val
函数分别访问密钥和val(实际上相当于(get map-entry 0)
和(get map-entry 1)
)。
(key map-entry) ;;=> :a
(val map-entry) ;;=> :v
您可以conj
将地图条目添加到地图上,就像您可以使用矢量一样。
答案 2 :(得分:2)
条件线程宏通常对此类事情有帮助。 特别是如果您已经在使用它们对数据应用一系列转换。这是创建http标头
的草图(let [compressed? true
custom-header? false]
(-> {:content-type "text/plain"}
(cond-> compressed? (assoc :content-encoding "gzip"))
(cond-> custom-header? (assoc :my-custom-header "foo"))
clojure.walk/stringify-keys))
;=> {"content-encoding" "gzip", "content-type" "text/plain"}