簡體   English   中英

如何在不知道Clojure中的鍵的情況下將地圖構造成鍵值對?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM