Функция обработки_каста Elixir GenServer не найдена

#elixir

#elixir

Вопрос:

Я новичок в Elixir, так что, вероятно, это что-то действительно простое, но я не смог найти ответ на этот вопрос.

Итак, у меня есть простой GenServer, подобный этому:

 defmodule BlobStorageActor do
  use GenServer

  def start_link do
    GenServer.start_link(__MODULE__, :ok, name: __MODULE__)  
  end

  def init(:ok) do
    {:ok, %{}}
  end

  def lookup(server, name) do
    GenServer.call(server, {:lookup, name})
  end

  def cp(pid, container, file_path) do
    GenServer.cast(pid, {:cp, container, file_path})
  end

  def handle_cast({:cp, container, file_path}, state) do
    %{body: containers} = ExAzure.request!(:list_containers)

    unless Enum.any?(containers, amp;( {:blob_container, container, _, _, _ } = amp;1)) do
      ExAzure.request(:create_container, [container])
    end

    ExAzure.request(:put_block_blob, [container, String.replace(file_path, " ", "_"), File.read!(file_path)])
  end
end
  

Но когда я делаю это:

 iex(53)> iex(4)> BlobStorageActor.cp(pid, "test", "Doxie 0008.pdf")
BlobStorageActor.cp(pid, "test", "Doxie 0008.pdf")
iex(53)> ** (FunctionClauseError) no function clause matching in GenServer.cast/2
iex(53)>     (elixir) lib/gen_server.ex:630: GenServer.cast({:ok, #PID<0.8023.0>}, {:cp, "test", "Doxie 0008.pdf"})
iex(53)> iex(4)> BlobStorageActor.cp(pid, "test", "Doxie 0008.pdf")
BlobStorageActor.cp(pid, "test", "Doxie 0008.pdf")
iex(53)> ** (FunctionClauseError) no function clause matching in GenServer.cast/2
iex(53)>     (elixir) lib/gen_server.ex:630: GenServer.cast({:ok, #PID<0.8023.0>}, {:cp, "test", "Doxie 0008.pdf"})
  

Почему я получаю эту ошибку?

 FunctionClauseError) no function clause matching in GenServer.cast/2
  

Любая помощь будет высоко оценена.

Комментарии:

1. Похоже, вы передаете {:ok, pid} вместо just pid .

2. Ну, это верно. Спасибо, это было настолько очевидно, что я должен был видеть это за милю.

3. Кроме того, поскольку вы называете GenServer with __MODULE__ (что не рекомендуется), вы также можете сделать что-то вроде: GenServer.cast(__MODULE__, {:cp, container, file_path}) Но поиск сервера по имени вместо pid немного, но медленнее, на случай, если это будет часто вызываться.