Clojure - Phá hủy
Destructuring là một chức năng trong Clojure, cho phép người ta trích xuất các giá trị từ cấu trúc dữ liệu, chẳng hạn như vectơ và liên kết chúng với các ký hiệu mà không cần phải duyệt qua cấu trúc dữ liệu một cách rõ ràng.
Hãy xem xét một ví dụ về việc phá hủy chính xác nghĩa là gì và nó diễn ra như thế nào.
Thí dụ
(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)
Chương trình trên tạo ra kết quả sau.
Đầu ra
1 2 3 4
Trong ví dụ trên, cần lưu ý những điều sau:
Chúng tôi đang xác định một vectơ của các số nguyên là 1, 2, 3 và 4.
Sau đó chúng tôi đang sử dụng ‘let’ câu lệnh gán 4 biến (a, b, c, và d) cho biến my-vector trực tiếp.
Nếu chúng tôi chạy ‘println’ trên bốn biến, chúng ta có thể thấy rằng chúng đã được gán cho các giá trị trong vector tương ứng.
Vì vậy, clojure đã hủy biến my-vector có bốn giá trị khi nó được gán bằng câu lệnh 'let'. Sau đó, bốn giá trị đã giải cấu trúc được gán cho bốn tham số tương ứng.
Nếu có các biến thừa không có giá trị tương ứng mà chúng có thể được gán, thì chúng sẽ được gán giá trị nil. Ví dụ sau đây làm rõ điểm này.
Thí dụ
(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ương trình trên tạo ra kết quả sau. Bạn có thể thấy từ đầu ra rằng vì biến cuối cùng 'e' không có giá trị tương ứng trong vectơ nên nó có giá trị là nil.
Đầu ra
1 2 3 4 nil
phần còn lại
Biến 'the-rest' được sử dụng để lưu trữ các giá trị còn lại, không thể được gán cho bất kỳ biến nào.
Ví dụ về cách sử dụng điều này được hiển thị trong chương trình sau.
Thí dụ
(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ương trình trên tạo ra kết quả sau. Từ kết quả đầu ra, bạn có thể thấy rõ rằng các giá trị 3 và 4 không thể được gán cho bất kỳ biến nào nên chúng được gán cho biến 'the-rest'.
Đầu ra
1 2 (3 4)
Bản đồ cấu trúc
Cũng giống như vectơ, bản đồ cũng có thể bị hủy. Sau đây là một ví dụ về cách có thể thực hiện điều này.
Thí dụ
(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ương trình trên tạo ra kết quả sau. Từ chương trình, bạn có thể thấy rõ rằng các giá trị ánh xạ của “a” và “b” được gán cho các biến của a và b.
Đầu ra
1 2
Tương tự trong trường hợp vectơ, nếu không có giá trị tương ứng trong bản đồ khi quá trình hủy cấu trúc xảy ra, thì biến sẽ được gán giá trị bằng nil.
Sau đây là một ví dụ.
Thí dụ
(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ương trình trên tạo ra kết quả sau.
Đầu ra
1 2 nil