大家好,我是對於 Clojure 一無所知的菜鳥小白工程師。
今天我們要來學習如何使用解構 Destructuring
。
try Clojure here: https://qa-mktg.codingrooms.com/compiler/clojure/
解構(Destructuring)的基本概念是,讓我們可以簡單地將名稱綁定到 集合
(向量、列表、映射…等)內的值上。讓我們用向量(vectors)看一個簡單的例子:
;; 返回集合的第一個元素
;; 注意,first-thing 在一個向內
(defn my-first
[[first-thing]]
first-thing)
(my-first ["oven" "bike" "war-axe"])
; => "oven"
在這裡,my-first
函數將 first-thing
與作為參數傳入的向量的第一個元素 ( "over"
)綁定起來。
這個向量就像是一個大大的牌子,向 Clojure 宣告:「嘿!這個函數將接收到一個 列表
或一個 向量
作為參數。請讓我更輕鬆地拆解這個參數的結構,並將不同部分的參數與有意義的名稱關聯起來!」當解構一個向量或列表時,我們可以為其中的元素取名字,也可以使用剩餘參數:
(defn chooser
[[first-choice second-choice & unimportant-choices]]
(println (str "你的第一個選擇是:" first-choice))
(println (str "你的第二個選擇是:" second-choice))
(println (str "我們忽略了其他的選擇。"
"這裡是它們,以防你需要哭泣:"
(clojure.string/join ", " unimportant-choices))))
(chooser ["果醬", "英俊傑克", "豬圈", "水行俠"])
; => 你的第一個選擇是:果醬
; => 你的第二個選擇是:英俊傑克
; => 我們忽略了其他的選擇。這裡是它們,以防你需要哭泣:豬圈, 水行俠
;; ps. 《Clojure for the Brave and True》書中的例子,有時候我是真的沒看懂(傳入的參數名稱的部分)
在這裡,剩餘參數 unimportant-choices
處理用戶在第一和第二個選擇之後提供的任意數量的額外選擇。
我們還可以解構映射(maps)。就像我們告訴 Clojure 通過提供一個向量來解構向量或列表一樣,我們可以通過提供一個映射來解構映射:
(defn announce-treasure-location
[{lat :lat lng :lng}]
(println (str "寶藏的緯度:" lat))
(println (str "寶藏的經度:" lng)))
(announce-treasure-location {:lat 28.22 :lng 81.33})
; => 寶藏的緯度:28.22
; => 寶藏的經度:81.33
這樣就在跟 Clojure 宣告:「嗨!Clojure!幫我將名稱 lat
與鍵 :lat
對應的值關聯起來。」