Elixir 协议与结构体
2023-12-15 14:59 更新
当同时使用协议与结构体时,Elixir的可扩展性就显示出来了.
在之前的章节,我们已经知道尽管结构体也是映射,但他们不和映射共享协议实现.让我们来定义一个和那一章中一样的User
结构体:
iex> defmodule User do
...> defstruct name: "john", age: 27
...> end
{:module, User,
<<70, 79, 82, ...>>, {:__struct__, 0}}
然后检查:
iex> Blank.blank?(%{})
true
iex> Blank.blank?(%User{})
** (Protocol.UndefinedError) protocol Blank not implemented for %User{age: 27, name: "john"}
结构体需要他们自己的协议实现:
defimpl Blank, for: User do
def blank?(_), do: false
end
如果需要的话,你可以自己定义User的空白判断.你还可以使用结构体来构建更强大的数据类型,例如队列,然后为其实现所有相关的协议,例如Enumerable
或Blank
.
以上内容是否对您有帮助:
更多建议: