web-dev-qa-db-ja.com

エリクサーのプロトコルと動作の違い

ビヘイビアはコールバックを定義し、プロトコルはシグニチャなしでメソッドを定義します。プロトコルを実装するモジュールは、これらすべてのメソッドの定義を提供する必要があります。ビヘイビアを使用するモジュールについても同じです。セマンティックの違いは何ですか?

私が考えることができる1つの違いは、プロトコルは1つのタイプに対して一度だけ実装できるのに対し、要件に基づいてモジュールの動作を複数回実装できることです。いつ何を使うべきかはっきりしています。これ以外に違いはありますか?

36
Aravindh S

プロトコルはタイプ/データベースのポリモーフィズムです。 Enum.each(foo, ...)を呼び出すと、具体的な列挙はfooのタイプから決定されます。

動作はタイプレスプラグインメカニズムです。 GenServer.start(MyModule)を呼び出すときは、プラグインとしてMyModuleを明示的に渡し、GenServerの汎用コードが必要に応じてこのモジュールを呼び出します。

40
sasajuric

同じトピックについてJoséValimが回答しました(Googleスレッドから https://groups.google.com/forum/#!msg/elixir-lang-talk/S0NlOoc4ThM/J2aD2hKrtuoJ

プロトコルは確かに動作+ディスパッチングロジックです。

しかし、私はあなたが行動のポイントを逃していると思います。行動は非常に便利です。たとえば、GenServerは動作を定義します。振る舞いは言う方法です:私に引数としてモジュールを与えてください、そして私はそれに対して次のコールバックを呼び出します、これらの引数など。 GenServer以外の動作のより複雑な例は、Ectoアダプターです。

ただし、データ構造があり、データ構造に基づいてディスパッチする場合、これは機能しません。したがって、プロトコル。

23
selvan