[Elixir]GenServerのcallとhandle_callにおける:nameによる指定

GenServer.start_link __MODULE__, default, [name: __MODULE__]name を指定することの必要性に関してメモ。

以下の通り、Sample.neko を読んだ時、 __MODULE__ にメッセージが送られてGenServerのコールバックであるhandle_call にメッセージが送られる。そのパターンマッチで処理される handle_call が決定、実際にプロセスで処理される。という一連の処理を作るために、 start_link では名前をちゃんと与えることが必要。そうでなければ、process idを直接指定しなくてはいけない。(それはあまり現実的ではない..)

defmodule Sample do
  use GenServer

  def start_link(default) do
    GenServer.start_link __MODULE__, default, [name: __MODULE__]
  end

  def neko(token \\ []) do
    GenServer.call __MODULE__, {:neko}
  end

  # sever
  def handle_call({:neko}, _from, state) do
    case token do
      :token ->
        {:reply, client(:token), state}
      _ ->
        {:reply, client, state}
    end
  end
end

関連した修正はこちら

https://github.com/KazuCocoa/my_bot_ex/commit/b9be93de02e47b97a2a2e93dcbb46104ddb47004

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中