酏剂中方案与行为的区别

Ara*_*h S 35 elixir

行为定义回调和协议定义没有签名的方法.实现协议的模块应该为所有这些方法提供定义.使用行为的模块也是如此.什么是语义差异?

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

sas*_*ric 39

协议是基于类型/数据的多态性.当我打电话时Enum.each(foo, ...),具体的枚举是根据类型决定的foo.

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

  • @rvirding你错了.行为只描述了模块中必须存在的功能.他们不对流程做任何事情. (8认同)
  • 此外,最重要的是,行为启动新进程,其中运行回调,而协议功能在同一进程中运行. (7认同)
  • @rvirding Erlang 中的行为也只是描述了模块中必须存在哪些函数。gen_event 是一个对生成过程不执行任何操作的行为示例。 (2认同)

sel*_*van 22

JoséValim对同一主题的回答(来自谷歌主题,https: //groups.google.com/forum/#!msg/elixir-lang-talk/S0NlOoc4ThM/J2aD2hKrtuoJ )

协议确实是行为+调度逻辑.

但是我认为你错过了行为的观点.行为非常有用.例如,GenServer定义了一种行为.行为是一种说法:给我一个模块作为参数,我将调用它上面的以下回调,这些参数等等.除了GenServer之外,更复杂的行为示例是Ecto适配器.

但是,如果您具有数据结构并且希望基于数据结构进行分派,则此操作无效.因此协议.