有什么意义:Elixir的GenServer示例中的ok init参数?

时间:2015-11-12 00:33:20

标签: elixir gen-server

Elixir's intro to 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 个答案:

答案 0 :(得分:3)

重要的是要记住,传递给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