- 教程
- 概述
- 环境
- Basic 语法
- 数据类型
- 变量
- 运算符
- 模式匹配( Pattern Matching)
- 决策( Decision Making)
- Strings( Strings)
- Char Lists( Char Lists)
- 列表和元组( Lists and Tuples)
- 关键字列表( Keyword Lists)
- Maps
- 模块( Modules)
- 别名( Aliases)
- 功能( Functions)
- 递归
- 循环
- Enumerables( Enumerables)
- Streams( Streams)
- Structs( Structs)
- 协议 Protocols
- File I/O
- 进程( Processes)
- Sigils( Sigils)
- 理解( Comprehensions)
- Typespecs( Typespecs)
- 行为( Behaviours)
- 错误处理( Errors Handling)
- Macros( Macros)
- (库)Libraries
- 有用的资源
- 讨论
- Show 例子
- Show 例子
- Show 例子
- Show 例子
- Show 例子
- if statement
- if..else statement
- unless statement
- unless..else statement
- cond
- case
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
协议 Protocols
协议是在Elixir中实现多态性的机制。 任何数据类型都可以调度协议,只要它实现协议即可。
让我们考虑使用协议的示例。 我们在前面的章节中使用了一个名为to_string的函数来将其他类型转换为字符串类型。 这实际上是一个协议。 它根据给出的输入动作而不会产生错误。 这似乎我们正在讨论模式匹配函数,但随着我们进一步发展,结果却不同。
请考虑以下示例以进一步了解协议机制。
让我们创建一个协议,显示给定输入是否为空。 我们将此协议称为blank? 。
定义协议
我们可以通过以下方式在Elixir中定义协议 -
defprotocol Blank do
def blank?(data)
end
如您所见,我们不需要为函数定义主体。 如果您熟悉其他编程语言中的接口,您可以将协议视为基本相同的东西。
所以这个协议说任何实现它的东西都必须是empty? 功能,虽然由实现者决定功能如何响应。 通过定义协议,让我们了解如何添加几个实现。
实施议定书
由于我们已经定义了一个协议,我们现在需要告诉它如何处理它可能获得的不同输入。 让我们以我们之前采取的例子为基础。 我们将为列表,映射和字符串实现空白协议。 这将显示我们传递的内容是否为空白。
#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
Note - 如果将此用于除定义协议之外的任何类型,则会产生错误。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论