簡體   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