大家好,我是對於 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 對應的值關聯起來。」