Elixir 的 GenServer 示例中的 :ok init 参数有什么意义?
What's the point of the :ok init argument in Elixir's GenServer example?
在 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
?
重要的是要记住,传递给 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
在 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
?
重要的是要记住,传递给 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