行为定义回调,协议(protocol)定义没有签名的方法。实现协议(protocol)的模块应该定义所有这些方法。对于使用行为的模块也是如此。语义上的区别是什么?
我能想到的一个区别是,一个协议(protocol)只能为单一类型实现一次,因为我们可以根据我们的要求多次实现模块的行为。我很清楚何时使用什么。除了这个还有其他区别吗?
最佳答案
协议(protocol)是基于类型/数据的多态性。当我调用 Enum.each(foo, ...)
,具体枚举由foo
的类型确定.
行为是一种无类型的插件机制。当我调用 GenServer.start(MyModule)
,我明确通过MyModule
作为插件,通用代码来自GenServer
将在需要时调用此模块。
关于elixir - Elixir 中的协议(protocol)和行为之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26215206/