繁体   English   中英

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

[英]Elixir: (FunctionClauseError) no function clause matching

我制作了这个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)>

感谢您的任何帮助。

如果没有子句匹配,Elixir不会默默地忽略函数调用 - 你得到一个FunctionClauseError 在这种情况下,当m > n_to中没有函数子句匹配,因此Elixir抛出该错误。 您需要添加另一个版本的_to ,它接受任何mn (或者你可以when m > n那里添加when 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
end

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

在查看此处给出的答案后,这会缩短它。 答案的答案很棒,谢谢你们。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM