- 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 - 类型声明
- Elixir - 行为
- Elixir - 错误处理
- Elixir - 宏
- Elixir - 库
- Elixir 有用资源
- Elixir - 快速指南
- Elixir - 有用资源
- Elixir - 讨论
Elixir - 协议
协议是Elixir中实现多态性的机制。只要数据类型实现了协议,就可以对其进行协议分发。
让我们考虑一个使用协议的例子。在前面的章节中,我们使用了一个名为`to_string`的函数来将其他类型转换为字符串类型。这实际上是一个协议。它根据给定的输入进行操作,不会产生错误。这看起来像是我们正在讨论模式匹配函数,但随着我们的深入,情况会变得不同。
考虑以下示例以进一步了解协议机制。
让我们创建一个协议来显示给定的输入是否为空。我们将此协议称为`blank?`。
定义协议
我们可以在Elixir中通过以下方式定义协议:
defprotocol Blank do def blank?(data) end
正如你所看到的,我们不需要为函数定义函数体。如果你熟悉其他编程语言中的接口,你可以将协议视为本质上相同的东西。
因此,这个协议表明,任何实现它的东西都必须具有`empty?`函数,尽管实现者如何响应该函数取决于实现者。在定义了协议之后,让我们了解如何添加几个实现。
实现协议
由于我们已经定义了一个协议,我们现在需要告诉它如何处理它可能接收到的不同输入。让我们基于我们之前使用的示例进行构建。我们将为列表、映射和字符串实现`blank`协议。这将显示我们传递的内容是否为空。
#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
**注意** - 如果你将其用于你未为其定义协议的任何类型,它将产生错误。
广告