gpt4 book ai didi

elixir - 在 Elixir 中跨协议(protocol)实现共享函数

转载 作者:行者123 更新时间:2023-12-04 13:38:55 26 4
gpt4 key购买 nike

我正在阅读 Dave Thomas 的书,目前正在探索 Elixir 中的协议(protocol)。我知道我可以使用 @fallback_to_any true 回退到通用协议(protocol)实现。 .例如:

defprotocol Caesar do
@fallback_to_any true
def encrypt(string, shift)
def rot13(string)
end

defimpl Caesar, for: BitString do
def encrypt(string, shift) do
# implementation for binary
end

def rot13(string) do
# implementation for binary
end
end

defimpl Caesar, for: List do
def encrypt(string, shift) do
# implementation for character list
end

def rot13(string) do
# implementation for character list
end
end

defimpl Caesar, for: Any do
def encrypt(string, shift) do
# generic implementation
end

def rot13(string) do
# generic implementation
end
end

但是在上述情况下,基本上 rot13/1 的每个实现看起来像这样:
def rot13(string) do
Caesar.encrypt(string, 13)
end

尽管如此,我目前必须在每个实现中重复这一点,这似乎是完全错误的。有没有办法分享 rot13/1Caesar 的所有实现中?

最佳答案

于是我找到了this question about delegation在实现中。这让我想知道 defdelegate在协议(protocol)内部工作,确实如此!因此,一个可能的解决方案如下:

defmodule Caesar.Shared do
def rot13(string) do
Caesar.encrypt(string, 13)
end
end

defprotocol Caesar do
def encrypt(string, shift)
defdelegate rot13(string), to: Caesar.Shared
end

defimpl Caesar, for: BitString do
def encrypt(string, shift) do
# implementation for binary
end
end

defimpl Caesar, for: List do
def encrypt(string, shift) do
# implementation for character list
end
end

我仍然对其他答案感兴趣。也许还有一种更好、更惯用的方法可以直接在协议(protocol)定义中执行此操作。

关于elixir - 在 Elixir 中跨协议(protocol)实现共享函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26032600/

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