Clojure - 解構



解構是 Clojure 中的一項功能,它允許您從資料結構(如向量)中提取值,並將它們繫結到符號,而無需顯式遍歷資料結構。

讓我們來看一個關於解構的具體含義及其工作方式的例子。

示例

(ns clojure.examples.example
   (:gen-class))
(defn Example []
   (def my-vector [1 2 3 4])
   (let [[a b c d] my-vector]
   (println a b c d)))
(Example)

以上程式產生以下輸出。

輸出

1 2 3 4

在以上示例中,需要注意以下幾點:

  • 我們定義了一個包含整數 1、2、3 和 4 的向量。

  • 然後,我們使用‘let’語句將 4 個變數(a、b、c 和 d)直接分配給 my-vector 變數。

  • 如果我們對這四個變數執行‘println’語句,我們可以看到它們已經被分別分配給了向量中的值。

因此,Clojure 在使用 'let' 語句賦值時,對包含四個值的 my-vector 變數進行了解構。解構後的四個值隨後被相應地分配給了四個引數。

如果存在沒有對應值的額外變數,則它們將被分配為 nil 值。以下示例說明了這一點。

示例

(ns clojure.examples.hello
   (:gen-class))
(defn Example []
   (def my-vector [1 2 3 4])
   (let [[a b c d e] my-vector]
   (println a b c d e)))
(Example)

以上程式產生以下輸出。您可以從輸出中看到,由於最後一個變數 'e' 在向量中沒有對應值,因此它等於 nil。

輸出

1 2 3 4 nil

the-rest

‘the-rest’ 變數用於儲存無法分配給任何變數的剩餘值。

以下程式顯示瞭如何使用它。

示例

(ns clojure.examples.example
   (:gen-class))
(defn Example []
   (def my-vector [1 2 3 4])
   (let [[a b & the-rest] my-vector]
   (println a b the-rest)))
(Example)

以上程式產生以下輸出。從輸出中,您可以清楚地看到,3 和 4 的值無法分配給任何變數,因此它們被分配給了 ‘the-rest’ 變數。

輸出

1 2 (3 4)

解構對映

就像向量一樣,對映也可以被解構。以下是如何實現此操作的示例。

示例

(ns clojure.examples.example
   (:gen-class))
(defn Example []
   (def my-map {"a" 1 "b" 2})
   (let [{a "a" b "b"} my-map]
   (println a b)))
(Example)

以上程式產生以下輸出。從程式中您可以清楚地看到,對映中 “a” 和 “b” 的值被分配給了變數 a 和 b。

輸出

1 2

類似於向量的情況,如果在解構發生時對映中沒有對應值,則變數將被分配 nil 值。

以下是一個示例。

示例

(ns clojure.examples.example
   (:gen-class))
(defn Example []
   (def my-map {"a" 1 "b" 2})
   (let [{a "a" b "b" c "c"} my-map]
   (println a b c)))
(Example)

以上程式產生以下輸出。

輸出

1 2 nil
廣告

© . All rights reserved.