[英]How do you destructure a map into key-value pairs without knowing the keys in Clojure?
假設我有一張這樣的地圖
{:a 1 :b 2 :c 3}
我想像這樣映射(注意 - 非工作偽代碼):
(mapcat (fn [[:key key-a][:value value-a]] (println "key: " key-a "\n value: " value-a )))
如果沒有首先獲取函數的鍵,映射它們並從函數中讀回它,這是否可行?
我的問題是: 如何在不知道Clojure中的鍵的情況下將地圖解構為鍵值對?
(seq {:a 1 :b 2 :c 3})
;([:a 1] [:b 2] [:c 3])
在地圖上調用seq
會為您提供一系列鍵值對。 seq
調用通常是隱式的。
對
MapEntry
,它表現為成對。 從而
(type (first {:a 1 :b 2 :c 3}))
;clojure.lang.MapEntry
你的偽代碼
(mapcat (fn [[:key key-a][:value value-a]] (println "key: " key-a "\n value: " value-a )))
......需要多次維修:
map
的集合。 MapEntry
解構為一對即可 map
而不是mapcat
將函數應用於每對。 幸運的是, mapcat
可以工作。 dorun
強制序列進行評估並將其丟棄。 REPL為您做前者,但正在運行的應用程序不需要。 這給了我們
(dorun
(map
(fn [[key-a value-a]] (println "key: " key-a " value: " value-a ))
{:a 1 :b 2 :c 3}))
哪個打印
key: :a value: 1
key: :c value: 3
key: :b value: 2
...並且返回 nil
。
map
地圖時,每個元素都是一個包含兩個值的向量:鍵和值。 你用這樣的向量來構造每個元素:
(def m {:a 1 :b 2 :c 3})
(map (fn [[key value]] (str "key: " key " > value: " value-a)) m)
請注意,傳遞給map
的函數返回一個String值,而不是對println
的調用,因為我們試圖通過將函數應用於每個值來轉換傳入的集合。 您可以將map
返回的集合傳遞給prn
來調試值,盡管REPL會為您打印出來。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.