2016-07-17 18 views
2

私はあなたが与えた数まで "カウント"するこのエリクシールモジュールを作成しました。エリクサー:(FunctionClauseError)関数の句の一致がありません

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

は、任意の助けてくれてありがとう。

答えて

2

句が一致しない場合、Elixirは関数呼び出しを黙って無視しません。FunctionClauseErrorが得られます。この場合、m > nの場合、_toの関数節が一致しないため、Elixirはそのエラーをスローします。 _toの別のバージョンを追加する必要があります。これにはmnが含まれています(必要に応じて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 
1

あなたはケース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 
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 
関連する問題