#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}
вместо justpid
.2. Ну, это верно. Спасибо, это было настолько очевидно, что я должен был видеть это за милю.
3. Кроме того, поскольку вы называете
GenServer
with__MODULE__
(что не рекомендуется), вы также можете сделать что-то вроде:GenServer.cast(__MODULE__, {:cp, container, file_path})
Но поиск сервера по имени вместо pid немного, но медленнее, на случай, если это будет часто вызываться.