gpt4 book ai didi

elixir - Protocol在elixir中有什么意义?

转载 作者:行者123 更新时间:2023-12-05 01:45:46 26 4
gpt4 key购买 nike

在使用了术语网络协议(protocol)(http、ftp 等)后,我对它在 Elixir 中的用法感到困惑。例如有对 Enum 模块和 Enumerable Protocol 的引用。 Elixir 文档说协议(protocol)是一种在 Elixir 中实现多态性的机制

它们不就是一个带有一组方法/函数的模块吗?有区别吗?

最佳答案

将协议(protocol)视为 Java 中的接口(interface)/Python 中的抽象类(事实上,java 接口(interface),特别是 python 抽象类更适合@behaviour,但无论如何。)

defprotocol Sound do
def make_sound(data)
end

defmodule Dog do
defstruct name: "Donny"
end

defimpl Sound, for: Dog do
def make_sound(data) do
"#{data.name} barks “woof”"
end
end

defmodule Cat do
defstruct name: "Hilly"
end

defimpl Sound, for: Cat do
def make_sound(data) do
"#{data.name} murrs “meow”"
end
end

在代码中:

%Dog{} |> Sound.make_sound
#⇒ "Donny barks “woof”"

或:

pet = .... # complicated code loading a struct
pet |> Sound.make_sound # here we don’t care what pet we have

这个机制用在字符串插值中:

"#{5}"

上面的工作是因为 IntegerString.Chars 的实现。实现只是调用

WHATEVER_IN_#{} |> String.Chars.to_string

获取二进制文件。例如。对于前面提到的 Dog 模块,我们可以实现 String.Chars:

defimpl String.Chars, for: Dog do
def to_string(term) do
"#{term.name} barks “woof”"
end
end

现在可以插入狗:

"#{%Dog{}}"
#⇒ "Donny barks “woof”"

关于elixir - Protocol在elixir中有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39973819/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com