iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
自我挑戰組

從零開始的 clojure系列 第 21

Day 21 Clojure - Function- Destructuring

  • 分享至 

  • xImage
  •  

前言

大家好,我是對於 Clojure 一無所知的菜鳥小白工程師。

今天我們要來學習如何使用解構 Destructuring

try Clojure here: https://qa-mktg.codingrooms.com/compiler/clojure/

Destructuring

解構(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 對應的值關聯起來。」

參考文章


上一篇
Day 20 Clojure - Function- Defining Functions with Docstrings, Parameters and Arity
下一篇
# Day 22 Clojure - Function- Function Body, and All Functions Are Created Equal
系列文
從零開始的 clojure23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言