0
我正在嘗試在Elixir中實施守衛子句。瞭解Elixir中的守衛子句
這就是我想要做的事:
def fib(n) when n < 1, do: n
但是當我測試,出現此錯誤:
** (FunctionClauseError) no function clause matching in ProjectEuler.fib/1
對我的生活中,我似乎無法理解這裏的問題。
我正在嘗試在Elixir中實施守衛子句。瞭解Elixir中的守衛子句
這就是我想要做的事:
def fib(n) when n < 1, do: n
但是當我測試,出現此錯誤:
** (FunctionClauseError) no function clause matching in ProjectEuler.fib/1
對我的生活中,我似乎無法理解這裏的問題。
從你提供的代碼看起來你只有一個模塊,只有一個功能 - 這裏顯示的一個。我假設你有這樣的事情:
defmodule MyModule do
def fib(n) when n < 1, do: n
end
所以,如果你喜歡運行代碼:
MyModule.fib(1)
這將失敗。這是因爲你的fib/1
無法匹配,因爲它有這個警衛條款when n < 1
。
爲了讓它通過,你需要添加另一個功能 - 限制較少(與不同的保護條款,或沒有任何):
defmodule MyModule do
def fib(n) when n < 1, do: n
def fib(n), do: fib(n-1) + fib(n-2)
end
這將使MyModule.fib(1)
調用適當的定義。
你需要知道 - 使用這種技術時,虛擬機將嘗試以匹配它們在模塊中定義的參數分析功能的定義,所以:
defmodule MyModule do
def fib(n), do: fib(n-1) + fib(n-2)
def fib(n) when n < 1, do: n
end
將是有問題的,因爲fib
與when
子句永遠不會匹配,因爲首先定義的限制性較小。
希望有幫助!
我們將需要看到比這更多的代碼。我假設你只有一個函數定義。您至少需要第二次,因爲只有傳入的號碼少於一次,您所顯示的號碼纔會匹配。 –
啊,那可能是我的問題了 – Bitwise