W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
解構(gòu)是Clojure中的一個(gè)功能,它允許從數(shù)據(jù)結(jié)構(gòu)(如向量)中提取值,并將它們綁定到符號,而不必顯式地遍歷數(shù)據(jù)結(jié)構(gòu)。
讓我們看一個(gè)例子,說明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
在上面的例子中,需要注意以下幾點(diǎn):
我們定義一個(gè)整數(shù)的向量為1,2,3和4。
然后我們使用'let'語句直接將4個(gè)變量(a,b,c和d)分配給my-vector變量。
如果我們對四個(gè)變量運(yùn)行'println'語句,我們可以看到它們已經(jīng)被分配給向量中的值。
所以clojure解構(gòu)了my-vector變量,當(dāng)使用'let'語句賦值時(shí),它有四個(gè)值。 然后將解構(gòu)的四個(gè)值相應(yīng)地分配給四個(gè)參數(shù)。
如果有過多的變量沒有可以分配給它們的對應(yīng)值,那么它們將被賦值為nil。 以下示例說明了這一點(diǎn)。
(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)生以下輸出。 你可以從輸出中看到,因?yàn)樽詈笠粋€(gè)變量'e'在向量中沒有對應(yīng)的值,它占了nil。
1 2 3 4 nil
'the-rest'變量用于存儲(chǔ)剩余的值,不能分配給任何變量。
下面的程序顯示了如何使用它的示例。
(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)。 以下是如何實(shí)現(xiàn)這一點(diǎ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ā)生時(shí)在映射中沒有對應(yīng)的值,則變量將被賦值為nil。
下面是一個(gè)例子。
(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
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: