- Elixir 教程
- Elixir - 主页
- Elixir - 概述
- Elixir - 环境
- Elixir - 基本语法
- Elixir - 数据类型
- Elixir - 变量
- Elixir - 操作员
- Elixir - 模式匹配
- Elixir - 决策
- Elixir - 弦乐
- Elixir - 角色列表
- Elixir - 列表和元组
- Elixir - 关键字列表
- Elixir - 地图
- Elixir - 模块
- Elixir - 别名
- Elixir - 功能
- Elixir - 递归
- Elixir - 循环
- Elixir - 可枚举
- Elixir - 流
- Elixir - 结构
- Elixir - 协议
- Elixir - 文件 I/O
- Elixir - 流程
- 长生不老药 - 印记
- Elixir - 领悟
- Elixir - 类型规格
- Elixir - Behave
- Elixir - 错误处理
- Elixir - 宏
- Elixir - 图书馆
- Elixir 有用资源
- Elixir - 快速指南
- Elixir - 有用的资源
- Elixir - 讨论
Elixir - 协议
协议是 Elixir 中实现多态性的一种机制。只要实现该协议,任何数据类型都可以在协议上进行调度。
让我们考虑一个使用协议的例子。我们在前面的章节中使用了一个名为to_string的函数来将其他类型转换为字符串类型。这实际上是一个协议。它根据给出的输入进行操作,不会产生错误。这看起来像是我们正在讨论模式匹配函数,但随着我们进一步深入,结果会有所不同。
考虑以下示例以进一步理解协议机制。
让我们创建一个协议,该协议将显示给定的输入是否为空。我们将此协议称为空白?。
定义协议
我们可以通过以下方式在 Elixir 中定义协议 -
defprotocol Blank do def blank?(data) end
正如您所看到的,我们不需要为函数定义主体。如果您熟悉其他编程语言中的接口,您可以将协议视为本质上相同的东西。
所以这个协议是说任何实现它的东西都必须有一个空?函数,尽管函数如何响应取决于实现者。定义协议后,让我们了解如何添加几个实现。
实施协议
既然我们已经定义了一个协议,我们现在需要告诉它如何处理它可能获得的不同输入。让我们以之前的例子为基础。我们将为列表、地图和字符串实现空白协议。这将显示我们传递的内容是否为空。
#Defining the protocol defprotocol Blank do def blank?(data) end #Implementing the protocol for lists defimpl Blank, for: List do def blank?([]), do: true def blank?(_), do: false end #Implementing the protocol for strings defimpl Blank, for: BitString do def blank?(""), do: true def blank?(_), do: false end #Implementing the protocol for maps defimpl Blank, for: Map do def blank?(map), do: map_size(map) == 0 end IO.puts(Blank.blank? []) IO.puts(Blank.blank? [:true, "Hello"]) IO.puts(Blank.blank? "") IO.puts(Blank.blank? "Hi")
您可以根据需要实现任意数量的协议,只要对协议的使用有意义即可。这是协议的一个非常基本的用例。当上面的程序运行时,它会产生以下结果 -
true false true false
注意- 如果您将其用于定义协议之外的任何类型,则会产生错误。