Elixir :( FunctionClauseError)没有函数子句匹配

时间:2016-07-17 04:26:02

标签: elixir

我已经制作了这个elixir模块,应该打印每个数字,"计数"达到你给它的数字。

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

...但是当我运行它时,它完全按预期执行,除了它在结尾处抛出此错误。这里发生了什么?

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:9)

如果没有任何条款匹配,Elixir不会默默地忽略函数调用 - 你得到-p。在这种情况下,当FunctionClauseError时,m > n中没有函数子句匹配,因此Elixir会抛出该错误。您需要添加_to的另一个版本,该版本接受任何_tom(或者如果您愿意,可以在那里添加n并且不执行任何操作。

when m > n

答案 1 :(得分:2)

m > n时您没有处理此案例,但您仍在调用它。你要么不要调用它,要么有一个处理这种情况的函数定义。

  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

答案 2 :(得分:0)

在查看此处给出的答案后,这会缩短它。对答案的解释非常好,谢谢你们。

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