我們在之前介紹過 Map 了
但有的時候我們需要一個可以有固定的欄位與預設值的 Map
Struct 必須在模組內定義,並且只能包含預先定義的欄位
defmodule User do
defstruct name: "Guest", age: 0, :email: nil
end
接著我們便能建立 User struct
%User{name: "Jack", age: 3}
#=> %User{name: "Jack", age: 3, email: nil}
如果在這個 struct 放入沒有預先定義的 key 會報錯
%User{address: "address"}
** (KeyError) key :address not found
expanding struct: User.__struct__/1
存取 map 的函式都可以在 struct 上面用
事實上 struct 本質就是 map
我們可以使用 Map.keys/1
來觀察
Map.keys(%User{name: "Jack", age: 3})
[:name, :__struct__, :age, :email]
可以發現他除了預先設定的欄位外還有 :__struct__
用 Map.get(user, :__struct__)
可以發現裡面裝著 User
我們可以在 pattern matcihing 時使用 struct 來比對
%User{} = user
def greet(%User{name: name}), do: "hi user #{name}"
def greet(_other), do: "who are u?"