Difference between protocol & behaviour in elixir

Elixir

Elixir 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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAravindh SView Question on Stackoverflow
Solution 1 - ElixirsasajuricView Answer on Stackoverflow
Solution 2 - ElixirselvanView Answer on Stackoverflow