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.
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
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
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