В чем смысл аргумента инициализации :ok в примере 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

?


person Chris Martin    schedule 12.11.2015    source источник
comment
Я не думаю, что это имеет значение, поскольку тесты все равно проходят, если вы используете :ok или nil. Прохождение :ok и наличие init(:ok) может быть просто дополнительной проверкой через сопоставление с образцом   -  person AbM    schedule 12.11.2015


Ответы (1)


Здесь важно помнить, что второй аргумент, переданный функции start_link, станет аргументом функции init. Поскольку это простой пример, они использовали атом типа :ok и могут быть заменены на nil. Вам нужно передать второй аргумент, будь то ноль.

Итак, отвечая на ваш вопрос, в этом примере :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
person coderVishal    schedule 12.11.2015