[Elixir]@behaviour and @callback

簡単なWebフレームワークを作ってみようと、Plugtrotを読んでいると、いたるところで @behaviour と描かれているものがありました。

GenServer なんかを use した時にOTPとしての振る舞いを、対象モジュールに与えることができました。そこで使われている Behaviour は把握していたのですが、この @ のアノテーションはパッと思い出すことができなかったので、メモがてら。

Elixir 1.2.xの時点が対象です。結論から書いておくと、この @behaviourBehaviour のことで、2.0では削除される Behaviour の代わりに推奨されているものです。

自身で定義したBehaviourに関して、以下のように @callback で定義したものを、 @behaviour で読み込んで使うという用途で使われます。ここで、読み込んだ先で @callback しているものを def で定義していない場合、 warning が表示されます。

例えば、以下の MyModuleMyGenServer の直前のコメント箇所のような。

これが、例えば、Plugだとこのリンク先 のように定義されていて、こんな感じでcallbackが用意されています。

defmodule MyPlug do
  @behaviour Plug

  def init(opts), do: opts
  def call(conn, _opts), do: conn
end

この他にも、 Plug.BuilderPlug.Parsers なんかでも使われています。

他に、

https://github.com/elixir-lang/elixir/blob/v1.2/lib/elixir/lib/module.ex

を見てみるといくつかのattributesが存在することもわかります。これらは、以下の preprocess_attribute/2postprocess_attribute\2 で定義されている通りです。

ここによると以下が使われているそうな。その詳細はmoduleのドキュメントを参照ください。

@on_load
@behaviour
@file
@before_compile
@after_compile
@on_definition
@type
@typep
@export_type
@opaque
@callback
@macrocallback

@doc
@typedoc
@moduledoc

なるほどね。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中