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