Elixir-プロトコル
プロトコルは、Elixirでポリモーフィズムを実現するためのメカニズムです。プロトコルでのディスパッチは、プロトコルを実装している限り、どのデータタイプでも利用できます。
プロトコルの使用例を考えてみましょう。と呼ばれる関数を使用しましたto_string前の章で、他の型から文字列型に変換します。これは実際にはプロトコルです。エラーを発生させることなく、与えられた入力に従って動作します。これは、パターンマッチング関数について説明しているように見えるかもしれませんが、さらに進むと、異なる結果になります。
プロトコルメカニズムをさらに理解するために、次の例を検討してください。
指定された入力が空かどうかを表示するプロトコルを作成しましょう。このプロトコルを呼び出しますblank?。
プロトコルの定義
Elixirでプロトコルを次のように定義できます-
defprotocol Blank do
def blank?(data)
end
ご覧のとおり、関数の本体を定義する必要はありません。他のプログラミング言語のインターフェースに精通している場合は、プロトコルを本質的に同じものと考えることができます。
したがって、このプロトコルは、それを実装するものはすべて、 empty?関数がどのように応答するかは実装者次第ですが。プロトコルを定義したら、いくつかの実装を追加する方法を理解しましょう。
プロトコルの実装
プロトコルを定義したので、取得する可能性のあるさまざまな入力を処理する方法をプロトコルに指示する必要があります。以前に取った例に基づいて構築しましょう。リスト、マップ、文字列には空白のプロトコルを実装します。これは、渡したものが空白かどうかを示します。
#Defining the protocol
defprotocol Blank do
def blank?(data)
end
#Implementing the protocol for lists
defimpl Blank, for: List do
def blank?([]), do: true
def blank?(_), do: false
end
#Implementing the protocol for strings
defimpl Blank, for: BitString do
def blank?(""), do: true
def blank?(_), do: false
end
#Implementing the protocol for maps
defimpl Blank, for: Map do
def blank?(map), do: map_size(map) == 0
end
IO.puts(Blank.blank? [])
IO.puts(Blank.blank? [:true, "Hello"])
IO.puts(Blank.blank? "")
IO.puts(Blank.blank? "Hi")
プロトコルの使用法に関係なく、必要な数のタイプに対してプロトコルを実装できます。これは、プロトコルのかなり基本的なユースケースでした。上記のプログラムを実行すると、次の結果が生成されます-
true
false
true
false
Note −プロトコルを定義したタイプ以外のタイプにこれを使用すると、エラーが発生します。