Вот пример:
defmodule Example do
def run() do
Demo.handle_in("UNEXPECTED", "foo", "bar")
end
def handle_in("click", map, socket) do
IO.puts("whatever")
end
end
А вот сообщение об ошибке, когда мы вызываем run/0
:
iex(1)> Example.run
** (FunctionClauseError) no function clause matching in Example.handle_in/3
The following arguments were given to Example.handle_in/3:
# 1
"UNEXPECTED"
# 2
"foo"
# 3
"bar"
Из этого вывода видно, что run/1
вызывает handle_in/3
с "UNEXPECTED"
в качестве первого аргумента. Нет пункта handle_in
, который ожидает этого, поэтому elixir генерирует ошибку. Обычный способ справиться с этим, если вы не можете контролировать входные данные, - это добавить предложение catch-all, которое не соответствует шаблонам аргументов:
def handle_in("click", map, socket) do
IO.puts("clicked")
end
def handle_in(one, two, three) do
IO.puts("Called with: #{inspect one}, #{inspect two}, #{inspect three}")
end
Теперь ошибка не возникает, поскольку втораяпредложение может обрабатывать строку "UNEXPECTED"
:
iex(1)> Example.run
Called with: "UNEXPECTED", "foo", "bar"
:ok
В вашем случае может случиться так, что строка "click"
не будет передана или что 2-й аргумент не является картой, содержащей "click"
ключ, но без кода вызова или сообщения об ошибке невозможно сказать.