[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

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s