ビヘイビアはコールバックを定義し、プロトコルはシグニチャなしでメソッドを定義します。プロトコルを実装するモジュールは、これらすべてのメソッドの定義を提供する必要があります。ビヘイビアを使用するモジュールについても同じです。セマンティックの違いは何ですか?
私が考えることができる1つの違いは、プロトコルは1つのタイプに対して一度だけ実装できるのに対し、要件に基づいてモジュールの動作を複数回実装できることです。いつ何を使うべきかはっきりしています。これ以外に違いはありますか?
プロトコルはタイプ/データベースのポリモーフィズムです。 Enum.each(foo, ...)
を呼び出すと、具体的な列挙はfoo
のタイプから決定されます。
動作はタイプレスプラグインメカニズムです。 GenServer.start(MyModule)
を呼び出すときは、プラグインとしてMyModule
を明示的に渡し、GenServer
の汎用コードが必要に応じてこのモジュールを呼び出します。
同じトピックについてJoséValimが回答しました(Googleスレッドから https://groups.google.com/forum/#!msg/elixir-lang-talk/S0NlOoc4ThM/J2aD2hKrtuoJ )
プロトコルは確かに動作+ディスパッチングロジックです。
しかし、私はあなたが行動のポイントを逃していると思います。行動は非常に便利です。たとえば、GenServerは動作を定義します。振る舞いは言う方法です:私に引数としてモジュールを与えてください、そして私はそれに対して次のコールバックを呼び出します、これらの引数など。 GenServer以外の動作のより複雑な例は、Ectoアダプターです。
ただし、データ構造があり、データ構造に基づいてディスパッチする場合、これは機能しません。したがって、プロトコル。