繁体   English   中英

lix剂中的协议和行为之间的区别

[英]Difference between protocol & behaviour in elixir

行为定义回调,协议定义没有签名的方法。 实现协议的模块应为所有这些方法提供定义。 使用行为的模块也是如此。 语义上有什么区别?

我能想到的一个区别是,一个协议只能为单个类型实现一次,因为我们可以根据需求多次为模块实现行为。 我清楚何时使用什么。 除此之外还有其他区别吗?

协议是基于类型/数据的多态性。 当我调用Enum.each(foo, ...) ,具体枚举由foo的类型确定。

行为是一种无类型的插件机制。 当我调用GenServer.start(MyModule) ,我明确地将MyModule作为插件传递,并且来自GenServer的通用代码将在需要时调用此模块。

由何塞·瓦利姆(JoséValim)回答了相同的主题(来自Google线程, https: //groups.google.com/forum/#!msg / elixir-lang-talk / S0NlOoc4ThM / J2aD2hKrtuoJ)

协议确实是一种行为+调度逻辑。

但是我认为您错过了行为的要点。 行为非常有用。 例如,GenServer定义行为。 行为是一种表达方式:给我一个模块作为参数,然后我将在其上调用以下回调,这些回调以此类推。 除了GenServer外,更复杂的行为示例是Ecto适配器。

但是,如果您具有数据结构并且要基于该数据结构进行调度,则此方法不起作用。 因此,协议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM