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]この例では、first は最初のマップ エントリをベクトルとして返すため、リスト分割形式が使用されます。

于 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 に答える