Difference between protocol & behaviour in elixir
ElixirElixir Problem Overview
Behaviours define callbacks & protocols define methods without signatures. Modules implementing a protocol should give definition for all those methods. Same for modules using a behaviour. What is the semantic difference?
One difference I can think of is, a protocol can be implemented for a single type only once where as we can implement a behaviour for a module multiple times based on our requirements. I am clear with when to use what. Is there any other difference other than this?
Elixir Solutions
Solution 1 - Elixir
Protocol is type/data based polymorphism. When I call Enum.each(foo, ...)
, the concrete enumeration is determined from the type of foo
.
Behaviour is a typeless plug-in mechanism. When I call GenServer.start(MyModule)
, I explicitly pass MyModule
as a plug-in, and the generic code from GenServer
will call into this module when needed.
Solution 2 - Elixir
Answered by José Valim on the same topic ( from google thread, https://groups.google.com/forum/#!msg/elixir-lang-talk/S0NlOoc4ThM/J2aD2hKrtuoJ )
> A protocol is indeed a behaviour + dispatching logic. > > However I think you are missing the point of behaviours. Behaviours > are extremely useful. For example, a GenServer defines a behaviour. A > behaviour is a way to say: give me a module as argument and I will > invoke the following callbacks on it, which these argument and so on. > A more complex example for behaviours besides a GenServer are the Ecto > adapters. > > However, this does not work if you have a data structure and you want > to dispatch based on the data structure. Hence protocols.