(FunctionClauseError) нет совпадений с функциональными предложениями в CheckersgameWeb.GamesChannel.handle_in / 3 - PullRequest
0 голосов
/ 26 октября 2019

В настоящее время я создаю игру в шашки в Фениксе, которая попадает в "FunctionClauseError". Ошибка генерируется моей функцией handle_in в игровом канале, который я предоставил здесь:

def handle_in("click", %{"click" => ll}, socket) do
    IO.puts("whatever")
end

Есть идеи о том, что мы делаем неправильно?

1 Ответ

1 голос
/ 27 октября 2019

Вот пример:

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" ключ, но без кода вызова или сообщения об ошибке невозможно сказать.

...