Clojure 解構(gòu)

2018-12-23 18:08 更新

解構(gòu)是Clojure中的一個功能,它允許從數(shù)據(jù)結(jié)構(gòu)(如向量)中提取值,并將它們綁定到符號,而不必顯式地遍歷數(shù)據(jù)結(jié)構(gòu)。

讓我們看一個例子,說明Destructuring是什么意思,以及它是如何發(fā)生的。

(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)

以上示例輸出以下結(jié)果:

輸出

1 2 3 4

在上面的例子中,需要注意以下幾點:

  • 我們定義一個整數(shù)的向量為1,2,3和4。

  • 然后我們使用'let'語句直接將4個變量(a,b,c和d)分配給my-vector變量。

  • 如果我們對四個變量運行'println'語句,我們可以看到它們已經(jīng)被分配給向量中的值。

所以clojure解構(gòu)了my-vector變量,當(dāng)使用'let'語句賦值時,它有四個值。 然后將解構(gòu)的四個值相應(yīng)地分配給四個參數(shù)。

如果有過多的變量沒有可以分配給它們的對應(yīng)值,那么它們將被賦值為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)

上述程序產(chǎn)生以下輸出。 你可以從輸出中看到,因為最后一個變量'e'在向量中沒有對應(yīng)的值,它占了nil。

輸出

1 2 3 4 nil

其余的部分

'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)

上述程序產(chǎn)生以下輸出。 從輸出中,可以清楚地看到3和4的值不能分配給任何變量,因此它們被分配給'-rest'變量。

輸出

1 2 (3 4)

解構(gòu)地圖

就像矢量一樣,地圖也可以被解構(gòu)。 以下是如何實現(xiàn)這一點的示例。

(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)

上述程序產(chǎn)生以下輸出。 從程序中可以清楚地看到“a”和“b”的映射值被分配給a和b的變量。

輸出

1 2

類似地,在向量的情況下,如果在解構(gòu)發(fā)生時在映射中沒有對應(yīng)的值,則變量將被賦值為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)

上述程序產(chǎn)生以下輸出。

輸出

1 2 nil

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號