0

1.0 实现看起来像这样。

defmodule Chat do
  use GenServer

  @derive [Access, Collectable]
  defstruct [api: APIClient, chat_id: nil, clients: %{}]

  def start_link(params), do: GenServer.start_link(__MODULE__, params)

  def init(params) do
    state = Enum.into(params, %__MODULE__{})
    {:ok, state}
  end

  ...
end

第一个问题是 Access 已被弃用,这是否意味着我必须在访问状态字段时更改点表示法?

第二个问题是,如果我不删除 @derive Collectable 我会收到此错误Collectable.Any is not available, cannot derive Collectable ...。这params是一个关键字列表,我想我可以将关键字列表转换为Mapwithstate = Map.merge(%__MODULE__{}, Enum.into(params, %{}))但感觉非常笨拙。

4

1 回答 1

1

我不确定具体Collectable问题,但是对于您的特定问题有一个更好的解决方案 - 从键值对列表构造一个结构。你可以使用Kernel.struct/2它。它不仅会为您构建结构,还会验证键,并仅使用结构中真正存在的键。从 1.2Kernel.struct!/2开始,如果提供的任何密钥无效,就会出现这种情况。

于 2016-01-22T10:42:27.623 回答