7

有没有办法解构键值对?我有一个将地图作为参数的函数,我想提取参数本身的键值和值。我怎么做 ?

我可以使用矢量执行以下操作 -

((fn [[ab]] (str ab)) [ab])

我如何对地图做同样/相似的事情 -

((fn[{kv}] (str kv)) {kv})

谢谢,穆尔塔萨

4

3 回答 3

19

函数 arg 列表中的映射解构旨在从映射中提取某些键并为其命名,如下所示:

core> (defn foo [{my-a :a my-b :b}] {my-a my-b})
core/foo                                                                                     
core> (foo {:a 1 :b 2})
{1 2}

我推荐这个教程。给出一个直接的等价物有点困难,((fn[{k v}] (str k v)) {k v})因为映射可能有许多键和许多值,因此解构代码将无法判断您在哪里寻找哪个键和值。按键解构更容易推理。

如果您想任意选择映射中的第一个条目,您可以提取它并在单个映射条目上使用列表解构形式:

core> (defn foo [[k v]] {v k})
#'core/foo                                                                                     
core> (foo (first {1 2}))
{2 1}   

在此示例中,使用列表解构形式[k v],因为首先将第一个映射条目作为向量返回。

于 2012-09-20T03:38:55.883 回答
2

有可用于解构地图的快捷方式。例如,如果您正在寻找特定的键,那么您不必输入 name1 :key1 name1 :key2...

例如

main=> (defn fbb [{:keys [foo bar baz]}] (+ foo bar baz))
#'main/fbb
main=> (fbb {:foo 2 :bar 3 :baz 4}) 
9

代替...

(defn fbb [{foo :foo bar :bar baz :baz}] (+ foo bar baz))

如果您的地图键是字符串,您可以说:strs代替,:keys如果它们是符号,您可以使用:syms.

于 2012-09-24T04:24:53.660 回答
-3
user=> (for [x (hash-map :a 1 :b 2 :c 3)] (str (first x) " " (second x)))
(":a 1" ":c 3" ":b 2")
于 2012-09-20T04:01:23.680 回答