Подтвердить что ты не робот

Разница между протоколом и поведением в эликсире

Поведение определяет обратные вызовы и протоколы, которые определяют методы без подписей. Модули, реализующие протокол, должны давать определение для всех этих методов. То же самое для модулей, использующих поведение. Что такое семантическая разница?

Единственное различие, о котором я могу думать, - это протокол, который может быть реализован только для одного типа только один раз, поскольку мы можем несколько раз применять поведение для модуля на основе наших требований. Я понимаю, когда использовать что. Есть ли другие отличия, кроме этого?

4b9b3361

Ответ 1

Протокол - это полиморфизм на основе типа/данных. Когда я вызываю Enum.each(foo, ...), конкретное перечисление определяется по типу foo.

Поведение - это беспристрастный механизм подключаемого модуля. Когда я вызываю GenServer.start(MyModule), я явно передаю MyModule в качестве подключаемого модуля, и общий код из GenServer будет вызывать в этот модуль, когда это необходимо.

Ответ 2

Ответил Хосе Валим по той же теме (из потока google, https://groups.google.com/forum/#!msg/elixir-lang-talk/S0NlOoc4ThM/J2aD2hKrtuoJ)

Протокол действительно является логикой поведения + диспетчеризации.

Однако я думаю, что вам не хватает смысла в поведении. поведения являются чрезвычайно полезными. Например, GenServer определяет поведение. поведение - это способ сказать: дай мне модуль как аргумент, и я вызывают следующие обратные вызовы, которые эти аргументы и так далее. Более сложным примером поведения, помимо GenServer, являются Ecto адаптеры.

Однако это не работает, если у вас есть структура данных и вы хотите для отправки на основе структуры данных. Следовательно, протоколы.