Я изучаю Elixir и пытаюсь создать приложение, похожее на Mars Rover Kata
Я использую GenServer для поддержания индивидуального состояния присутствующих одиночных роверов, и с помощью реестра я пытаюсь сгенерироватьключ, т. е. имя ровера
код Rover.ex
defstruct [:x, :y, :direction, :name]
def start_link({x, y, d, name}) do
GenServer.start_link(__MODULE__, {x, y, d, name}, name: RegistryHelper.create_key(name))
end
def init({x, y, d, name}) do
{:ok, %Rover{x: x, y: y, direction: d, name: name}}
# {:ok, %{}}
end
def get_state(name) do
GenServer.call(RegistryHelper.create_key(name), :get_state)
end
def handle_call(:get_state, _from, state) do
{:reply, {:ok, {state.x, state.y, state.direction}}, state}
end
Registry_helper.ex
defmodule RegistryHelper do
@spec create_key(String.t) :: {:via, atom, {atom, String.t}}
def create_key(name), do: {:via, Registry, {Rover.Registry, name}}
@spec register(String.t) :: {:ok, pid} | {:error, {:already_registered, pid}}
def register(name), do: Registry.register(Rover.Registry, create_key(name), [])
@spec get_pid(String.t) :: pid
def get_pid(name) do
[{pid, _}] = Registry.lookup(Rover.Registry, name)
pid
end
end
** (ArgumentError) unknown registry: Rover.Registry
code: {:ok, _} = Rover.start_link({9, 9, :N, "rover0"})
stacktrace:
(elixir) lib/registry.ex:1154: Registry.key_info!/1
(elixir) lib/registry.ex:213: Registry.whereis_name/2
(stdlib) gen.erl:76: :gen.start/6
test/rover_test.exs:5: (test)
, что-то не так с модулем реестра иликак я передаю параметр start_link?