Какой смысл в аргументе: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
Другие вопросы по тегам