15-結構體
15-結構體
在之前的幾章中,我們談到過圖:
iex> map = %{a: 1, b: 2}
%{a: 1, b: 2}
iex> map[:a]
1
iex> %{map | a: 3}
%{a: 3, b: 2}
結構體是基於圖的一個擴充套件。它將預設值,編譯時保證和多型性帶入Elixir。
定義一個結構體,你只需在某模組中呼叫defstruct/1
:
iex> defmodule User do
...> defstruct name: "john", age: 27
...> end
{ :module, User, <<70, 79, 82, ...>>, {:__struct__, 0} }
現在可以用%User()
語法建立這個結構體的“例項”了:
iex> %User{}
%User{name: "john", age: 27}
iex> %User{name: "meg"}
%User{name: "meg", age: 27}
iex> is_map(%User{})
true
結構體的編譯時保證指的是編譯時會檢查結構體的欄位存不存在:
iex> %User{oops: :field}
** (CompileError) iex:3: unknown key :oops for struct User
當討論圖的時候,我們演示瞭如何訪問和修改圖現有的欄位。結構體也是一樣的:
iex> john = %User{}
%User{name: "john", age: 27}
iex> john.name
"john"
iex> meg = %{john | name: "meg"}
%User{name: "meg", age: 27}
iex> %{meg | oops: :field}
** (ArgumentError) argument error
通過使用這種修改的語法,虛擬機器知道沒有新的鍵增加到圖/結構體中,使得圖可以在記憶體中共享它們的結構。 在上面例子中,john和meg共享了相同的鍵結構。
結構體也能用在模式匹配中,它們保證結構體有相同的型別:
iex> %User{name: name} = john
%User{name: "john", age: 27}
iex> name
"john"
iex> %User{} = %{}
** (MatchError) no match of right hand side value: %{}
匹配能工作,是由於結構體再底層圖中有個欄位叫__struct__
:
iex> john.__struct__
User
總之,結構體就是個光禿禿的圖外加一個預設欄位。我們這裡說的光禿禿的圖指的是,為圖實現的協議都不能用於結構體。 例如,你不能美劇也不能訪問一個結構體:
iex> user = %User{}
%User{name: "john", age: 27}
iex> user[:name]
** (Protocol.UndefinedError) protocol Access not implemented for %User{age: 27, name: "john"}
結構體也不是字典,因為也不適用字典模組的函式:
iex> Dict.get(%User{}, :name)
** (ArgumentError) unsupported dict: %User{name: "john", age: 27}
下一章我們將介紹結構體是如何同協議進行互動的。
相關文章
- 結構體中套用其他_結構體結構體
- Oracle體系結構:記憶體結構和程式結構(轉)Oracle記憶體
- 結構體結構體
- Oracle體系結構之-記憶體結構Oracle記憶體
- Oracle體系結構之-物理結構Oracle
- Go 結構體Go結構體
- 結構體struct結構體Struct
- 結構體與共用體結構體
- Oracle體系結構之記憶體結構(SGA、PGA)Oracle記憶體
- 3:Oracle體系結構(邏輯結構)Oracle
- [Virtualization]ESXi體系結構與記憶體管理(一)體系結構記憶體
- ORACLE體系結構小結Oracle
- oracle體系結構總結Oracle
- 【PG體系結構】PG體系結構簡單說明
- 已知結構體成員地址獲取結構體首地址結構體
- 結構體問題結構體
- BeanFactory體系結構Bean
- 【JVM體系結構】JVM
- Deployer整體結構
- Servlet 體系結構Servlet
- 結構體相關結構體
- C 結構體概述結構體
- GPU硬體結構GPU
- MySQL 體系結構MySql
- 記憶體結構記憶體
- 類與結構體結構體
- JVM - 整體結構JVM
- MongoDB 體系結構MongoDB
- 前端結構體系前端結構體
- 結構體的大小結構體
- [譯]空結構體結構體
- 【EJB體系結構】
- postgresql體系結構SQL
- 體系結構1
- C#結構體C#結構體
- 實驗 結構體結構體
- oracle體系結構Oracle
- SQLite體系結構SQLite