• ユーザーに実装して欲しい機能を定義する

  • 使用するユーザーはビヘイビアに沿って関数を実装する

  • ライブラリ作者は対象のモジュールがビヘイビアに沿って実装されていることを期待して処理を実装できる

  • 超強化型コールバック

defmodule Base do
  # greetという関数を実装するようユーザーに強制する
  @callback greet(name :: String.t()) :: String.t()
end
 
defmodule UseSample do
  @behaviour Base # Baseを元にした実装をしていると宣言する
 
  @impl # Baseに定義されている関数であると明示的に示す。別に無くても動くけど、あるとなお良い(なお1つ付けたら全てに付けなければいけない)
  def greet(name) do
    "Hi, #{name}"
  end
end
 
defmodule Execute do
  def get_name(mod) do
    name = IO.gets("whats your name? >") # Elixirと入力したと仮定
 
    # greetが実装されている前提の処理を実行。implでコンパイルが通っている時点で実装されていることが保証される。
    mod.greet(name) # Hi, Elixirと出力される
  end
end