Elixir-behaviours

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

エリクサー-行動

Elixir(およびErlang)の動作は、コンポーネントの一般的な部分(動作モジュールになる)と特定の部分(コールバックモジュールになる)を分離して抽象化する方法です。 行動はする方法を提供します-

  • モジュールによって実装される必要がある一連の関数を定義します。
  • モジュールがそのセットのすべての機能を実装していることを確認してください。

必要に応じて、Javaのようなオブジェクト指向言語のインターフェースのような振る舞いを考えることができます:モジュールが実装しなければならない関数シグネチャのセット。

動作の定義

独自の動作を作成し、この一般的な動作を使用してモジュールを作成する例を考えてみましょう。 私たちは、異なる言語で人々に挨拶と挨拶をする行動を定義します。

defmodule GreetBehaviour do
   @callback say_hello(name :: string) :: nil
   @callback say_bye(name :: string) :: nil
end
*@ callback* ディレクティブは、採用モジュールが定義する必要がある関数をリストするために使用されます。 また、noも指定します。 引数の種類、その戻り値。

行動を採用する

動作を正常に定義しました。 次に、複数のモジュールでそれを採用および実装します。 この動作を英語とスペイン語で実装する2つのモジュールを作成しましょう。

defmodule GreetBehaviour do
   @callback say_hello(name :: string) :: nil
   @callback say_bye(name :: string) :: nil
end

defmodule EnglishGreet do
   @behaviour GreetBehaviour
   def say_hello(name), do: IO.puts("Hello " <> name)
   def say_bye(name), do: IO.puts("Goodbye, " <> name)
end

defmodule SpanishGreet do
   @behaviour GreetBehaviour
   def say_hello(name), do: IO.puts("Hola " <> name)
   def say_bye(name), do: IO.puts("Adios " <> name)
end

EnglishGreet.say_hello("Ayush")
EnglishGreet.say_bye("Ayush")
SpanishGreet.say_hello("Ayush")
SpanishGreet.say_bye("Ayush")

上記のプログラムが実行されると、次の結果が生成されます-

Hello Ayush
Goodbye, Ayush
Hola Ayush
Adios Ayush

すでに見たように、モジュールで @ behaviour ディレクティブを使用した動作を採用しています。 すべての_child_モジュールの動作に実装されているすべての関数を定義する必要があります。 これは、OOP言語のインターフェイスとほぼ同等と見なすことができます。