web-dev-qa-db-fra.com

Elixir: (FunctionClauseError) aucune correspondance de clause de fonction

J'ai créé ce module d'élixir qui doit imprimer chaque nombre, en "comptant" le nombre que vous lui donnez.

defmodule Count do
  def to(n) do
    m = 1
    _to(n, m)
  end
  defp _to(n, m) when (m <= n) do
    IO.puts "#{m}"
    x = m + 1
    _to(n, x)
  end
end

... mais lorsque je l'exécute, il fonctionne exactement comme prévu, sauf que cette erreur est générée à la fin. Que se passe-t-il ici?

iex(1)> Count.to 5  
1
2
3
4
5
** (FunctionClauseError) no function clause matching in Count._to/2
count.exs:6: Count._to(5, 6)
iex(1)>

Merci pour toute aide.

7
Kevin Falting

Elixir n'ignore pas en silence un appel de fonction si aucune des clauses ne correspond - vous obtenez une FunctionClauseError. Dans ce cas, lorsque m > n, aucune clause de fonction dans _to ne correspond, Elixir renvoie donc cette erreur. Vous devez ajouter une autre version de _to qui accepte les m et n (ou vous pouvez ajouter un when m > n si vous le souhaitez) et ne fait rien.

defp _to(n, m) when (m <= n) do
  IO.puts "#{m}"
  x = m + 1
  _to(n, x)
end
defp _to(n, m) do
end
8
Dogbert

Vous n'avez pas traité le cas lorsque m > n, mais vous l'appelez toujours. Soit vous ne l'appelez pas, soit vous avez une définition de fonction qui gère ce cas. 

  defp _to(n, m) when (m <= n) do
    IO.puts "#{m}"
    x = m + 1
    _to(n, x)
  end

  defp _to(n, m), do: IO.puts "Completed Counting" end
1
coderVishal

Cela le raccourcit après avoir examiné les réponses données ici. L'explication de la réponse était excellente, merci les gars.

defmodule Count do
  def to(n, m \\ 1)
  def to(n, m) when n == m, do: IO.puts "#{n}"
  def to(n, m) do
    IO.puts "#{m}"
    to(n, m + 1)
  end
end
0
Kevin Falting