Как исправить '** (ArgumentError) неизвестный реестр: Rover.Registry' в Elxir - PullRequest
0 голосов
/ 08 мая 2019

Я изучаю 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?

1 Ответ

0 голосов
/ 08 мая 2019

Вы никогда не начнете Registry.Если у вас нет лучшего места для его регистрации (например, где-то в Application.start/2), самый простой обходной путь - это запустить его с Rover.start_link/1:

def start_link({x, y, d, name}) do
  # Better start it supervised!
  Registry.start_link(keys: :unique, name: Rover.Registry)

  GenServer.start_link(
    __MODULE__, {x, y, d, name},
    name: RegistryHelper.create_key(name))
end
...