iT邦幫忙

2025 iThome 鐵人賽

DAY 15
0

我們在之前介紹過 Map 了
但有的時候我們需要一個可以有固定的欄位與預設值的 Map

定義 Struct

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

存取 Struct

存取 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 matching 時

我們可以在 pattern matcihing 時使用 struct 來比對

限制只有該 struct 可以匹配

%User{} = user
def greet(%User{name: name}), do: "hi user #{name}"
def greet(_other), do: "who are u?"

上一篇
文件、註解與文件測試
下一篇
Sigil (符咒)
系列文
通勤看手機就可讀懂的 Elixir 語言入門教學17
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言