GenServer可以在Elixir中拥有自己的结构吗?

时间:2018-08-23 08:45:20

标签: elixir gen-server

场景:

  • 我有一个简单的 GenServer 来管理某些状态。
  • 当前,我正在使用 map来管理自己的状态。但随着 我正在向该州添加更多数据。

问题:

  • 因此,为了获得一定的编译时保证,我的struct模块中可以有一个GenServer吗?
  • 如果可以,这是正确的方法吗?
  • 如果没有,还有什么选择?

1 个答案:

答案 0 :(得分:4)

只需声明一个普通结构(可以选择在GenServer名称空间中嵌套的模块中)并将其用作初始状态:

defmodule Test do
  defmodule State do
    defstruct ~w|foo bar baz|a
  end

  use GenServer

  def start_link(opts \\ []) do
    GenServer.start_link(__MODULE__, %State{foo: 42, bar: opts}, name: __MODULE__)
  end

  @impl true
  def init(opts \\ []), do: {:ok, opts}

  def state, do: GenServer.call(__MODULE__, :state)

  @impl true
  def handle_call(:state, _from, %State{} = state) do
    {:reply, state, state}
  end
end

with {:ok, _} <- Test.start_link(pi: 3.14) do
  IO.inspect Test.state, label: "State"
end
#⇒ State: %Test.State{bar: [pi: 3.14], baz: nil, foo: 42}