使用 via 元组注册 GenServer 时遇到问题。 ** (UndefinedFunctionError) 函数 PokerServer.whereis_name/1 未定义或私有)

Trouble registering a GenServer with a via tuple. ** (UndefinedFunctionError) function PokerServer.whereis_name/1 is undefined or private)

这是一个非常简单的 GenServer。我正在尝试使用 via 元组在初始化时注册它。

defmodule PokerServer do
  use GenServer

  def start(id) do
    GenServer.start(__MODULE__, id, name: {:via, __MODULE__, id})
  end

  @impl GenServer
  def init(id) do
    {:ok, id}
  end
end

除非我在 the documentation 中误解了什么,否则我应该能够在 GenServer 的第三个参数中将 via 元组作为名称传递。start/3

除了当我尝试在 iex shell 中启动进程时,我触发了一个错误

iex(1)> PokerServer.start(123)
** (UndefinedFunctionError) function PokerServer.whereis_name/1 is undefined or private
(live_draft 0.1.0) PokerServer.whereis_name(123)
(stdlib 3.14.2.2) gen.erl:83: :gen.start/6

编辑:我使用 elixir 1.12.3 和 erlang/OTP 23

您在 {:via, __MODULE__, id} 中传递的模块应该导出 register_name/2unregister_name/1whereis_name/1send/2。例如:

def start(id) do
  GenServer.start(__MODULE__, id, name: {:via, :global, id})
end

One such example is the :global module which uses these functions for keeping the list of names of processes and their associated PIDs that are available globally for a network of Elixir nodes. Elixir also ships with a local, decentralized and scalable registry called Registry for locally storing names that are generated dynamically. Documentation