我已经制作了这个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)>
感谢您的帮助。
答案 0 :(得分:9)
如果没有任何条款匹配,Elixir不会默默地忽略函数调用 - 你得到-p
。在这种情况下,当FunctionClauseError
时,m > n
中没有函数子句匹配,因此Elixir会抛出该错误。您需要添加_to
的另一个版本,该版本接受任何_to
和m
(或者如果您愿意,可以在那里添加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