Elixir - Cấu trúc
Cấu trúc là phần mở rộng được xây dựng trên bản đồ cung cấp kiểm tra thời gian biên dịch và các giá trị mặc định.
Xác định cấu trúc
Để xác định một cấu trúc, cấu trúc defstruct được sử dụng:
defmodule User do
defstruct name: "John", age: 27
end
Danh sách từ khóa được sử dụng với defstruct xác định các trường mà struct sẽ có cùng với các giá trị mặc định của chúng. Các cấu trúc lấy tên của mô-đun mà chúng được định nghĩa. Trong ví dụ ở trên, chúng tôi đã xác định một cấu trúc có tên Người dùng. Bây giờ chúng tôi có thể tạo cấu trúc Người dùng bằng cách sử dụng cú pháp tương tự như cú pháp được sử dụng để tạo bản đồ -
new_john = %User{})
ayush = %User{name: "Ayush", age: 20}
megan = %User{name: "Megan"})
Đoạn mã trên sẽ tạo ra ba cấu trúc khác nhau với các giá trị:
%User{age: 27, name: "John"}
%User{age: 20, name: "Ayush"}
%User{age: 27, name: "Megan"}
Các cấu trúc cung cấp đảm bảo thời gian biên dịch rằng chỉ các trường (và tất cả chúng) được xác định thông qua defstruct mới được phép tồn tại trong một cấu trúc. Vì vậy, bạn không thể xác định các trường của riêng mình khi bạn đã tạo cấu trúc trong mô-đun.
Truy cập và cập nhật cấu trúc
Khi thảo luận về bản đồ, chúng tôi đã chỉ ra cách chúng tôi có thể truy cập và cập nhật các trường của bản đồ. Các kỹ thuật tương tự (và cùng một cú pháp) cũng áp dụng cho các cấu trúc. Ví dụ: nếu chúng ta muốn cập nhật người dùng mà chúng ta đã tạo trong ví dụ trước đó, thì -
defmodule User do
defstruct name: "John", age: 27
end
john = %User{}
#john right now is: %User{age: 27, name: "John"}
#To access name and age of John,
IO.puts(john.name)
IO.puts(john.age)
Khi chương trình trên được chạy, nó tạo ra kết quả sau:
John
27
Để cập nhật một giá trị trong một cấu trúc, chúng tôi sẽ sử dụng lại quy trình tương tự mà chúng tôi đã sử dụng trong chương bản đồ,
meg = %{john | name: "Meg"}
Các cấu trúc cũng có thể được sử dụng trong đối sánh mẫu, vừa để đối sánh giá trị của các khóa cụ thể vừa để đảm bảo rằng giá trị đối sánh là cấu trúc cùng loại với giá trị đã khớp.