elixir - Elixir 中 GenServer 可以有自己的结构吗?

标签 elixir gen-server

场景:

  • 我有一个简单的GenServer来管理某些状态。
  • 目前,我正在使用 map 来管理我的状态。但它正在增长 我正在向该状态添加更多数据。

问题:

  • 那么,为了获得一些编译时保证,我的 GenServer 模块中可以有一个 struct 吗?
  • 如果是,这是正确的方法吗?
  • 如果没有,还有哪些替代方案?

最佳答案

只需声明一个普通结构(可以选择在 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}

关于elixir - Elixir 中 GenServer 可以有自己的结构吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51981683/

相关文章:

testing - 如何正确测试 GenServer 中的 handle_cast?

routing - 从 Phoenix 提供静态 TXT 文件

elixir - 如何测试函数保护子句中结构的值?

ecmascript-6 - ES6 生成器函数导致错误 : Uncaught ReferenceError: regeneratorRuntime is not defined

elixir - Phoenix : Having a JSON and HTML representation of the same resource

erlang - 在 Erlang 中必须使用工作池吗?

elixir - 构建对自身的 GenServer 调用的正确方法

elixir - 匹配 router.ex 中参数的 URL 的其余部分

erlang - 解决两个 gen_tcp 之间的死锁

erlang - 为什么我的 gen_server 实现会超时?