Elixir-protocols

提供:Dev Guides
移動先:案内検索

Elixir-プロトコル

プロトコルは、Elixirで多型を実現するメカニズムです。 プロトコルのディスパッチは、プロトコルを実装している限り、どのデータ型でも利用できます。

プロトコルの使用例を考えてみましょう。 前の章で to_string という関数を使用して、他の型から文字列型に変換しました。 これは実際にはプロトコルです。 エラーを生成せずに与えられた入力に従って動作します。 これは、パターンマッチング関数について説明しているように見えるかもしれませんが、さらに先に進むと、異なることがわかります。

プロトコルメカニズムをさらに理解するには、次の例を検討してください。

与えられた入力が空かどうかを表示するプロトコルを作成しましょう。 このプロトコルを*空白?*と呼びます。

プロトコルの定義

私たちは次の方法で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

注意-プロトコルを定義したもの以外のタイプにこれを使用すると、エラーが発生します。