📅  最后修改于: 2020-11-05 04:04:38             🧑  作者: Mango
解构是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已解构了my-vector变量,该变量在使用’let’语句分配时具有四个值。然后将解构的四个值相应地分配给四个参数。
如果有多余的变量没有可分配给它们的对应值,则将为它们分配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’变量用于存储剩余值,这些剩余值无法分配给任何变量。
以下程序显示了有关如何使用它的示例。
(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