用不止一件事初始化 GenServer 状态

Initializing GenServer state with more than one thing

我想创建一个开始时需要多个状态的 GenServer。特别是 init 函数启动了一个需要知道一些初始状态的计时器。我知道 GenServer.start_link 的第二个参数直接传递给 init(arg).

但是我找不到一个示例来说明如何在 init 中传递多个状态参数以进行初始化。例如,想要的东西是:

defmodule Application.Test do
  require GenServer

  def start_link(state1, state2) do 
    GenServer.start_link(__MODULE__, [state1, state2], [])
  end 

  def init(state) do
    # Use the state to launch timer
  end
end

但是,既然我可以' 找不到一个例子,而且我对长生不老药真的很陌生,这对我来说似乎不是惯用的。有没有 better/more 有效的方法,或者这是最好的方法?

只需将您的状态包装在 TupleStruct 中,如下所示:

start_link(state1, state2) do
  Genserver.start_link(__MODULE__, {state1, state2}, [])
end

# use pattern matching to extract the states
def init({state1, state2}) do
  # use state1 and state2
end