Какой смысл в аргументе:ok init в примере Elixir GenServer?
Во вступлении Elixir к GenServer клиентский API запускает сервер с :ok
аргумент
def start_link(opts \\ []) do
GenServer.start_link(__MODULE__, :ok, opts)
end
И сервер init
функция требует, чтобы ее аргумент был :ok
def init(:ok) do
{:ok, HashDict.new}
end
Какой смысл проходить и проверять :ok
? Было бы по-другому, если бы мы пропустили это и вместо этого написали что-то вроде
def start_link(opts \\ []) do
GenServer.start_link(__MODULE__, nil, opts)
end
def init(_) do
{:ok, HashDict.new}
end
?
1 ответ
Здесь важно помнить, что второй аргумент передан start_link
станет аргументом init
функция. Поскольку это простой пример, они использовали атом как: хорошо и могут быть заменены на ноль. Вам нужно передать второй аргумент, будь то ноль.
Итак, отвечая на ваш вопрос, в этом примере :ok
можно заменить на nil
, Я думаю, что они использовали :ok
поскольку должен быть аргумент и :ok
выглядит как хороший выбор (просто предпочтение)
В других ситуациях вы должны использовать эту информацию для получения некоторых важных данных или для сопоставления с образцом
defmodule ServerDrop do
use GenServer
defmodule State do
defstruct count: 0
end
def start_link do
GenServer.start_link(__MODULE__,:ok,[{:name,__MODULE__}])
#GenServer.start_link(__MODULE__,[],[{:name,__MODULE__}])
end
def init(:ok) do
{:ok,%State{count: 10}}
end
def init([]) do
{:ok,%State{}}
end
#Code left out for brevity
В других ситуациях вам нужно получить некоторые данные
def init(stash_pid) do
current_number = Stash.get_value stash_pid
{:ok,{current_number,stash_pid}}
end