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