Clojure - การทำลายล้าง
Destructuring เป็นฟังก์ชันการทำงานภายใน 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' จากนั้นค่าสี่ค่าที่แยกโครงสร้างออกมาจะถูกกำหนดให้กับพารามิเตอร์ทั้งสี่ตามนั้น
หากมีตัวแปรส่วนเกินที่ไม่มีค่าที่สอดคล้องกันซึ่งสามารถกำหนดให้ได้ตัวแปรเหล่านั้นจะถูกกำหนดค่าของศูนย์ ตัวอย่างต่อไปนี้ทำให้ประเด็นนี้ชัดเจน
ตัวอย่าง
(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' ไม่มีค่าที่สอดคล้องกันในเวกเตอร์จึงมีค่าเป็นศูนย์
เอาต์พุต
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 ไม่สามารถกำหนดให้กับตัวแปรใด ๆ ได้ดังนั้นจึงถูกกำหนดให้กับตัวแปร "ส่วนที่เหลือ"
เอาต์พุต
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
ในกรณีของเวกเตอร์หากไม่มีค่าที่สอดคล้องกันในแผนที่เมื่อการทำลายเกิดขึ้นตัวแปรจะถูกกำหนดค่าเป็นศูนย์
ต่อไปนี้เป็นตัวอย่าง
ตัวอย่าง
(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