2017-06-23 141 views
0

我正在嘗試在Elixir中實施守衛子句。瞭解Elixir中的守衛子句

這就是我想要做的事:

def fib(n) when n < 1, do: n 

但是當我測試,出現此錯誤:

** (FunctionClauseError) no function clause matching in ProjectEuler.fib/1 

對我的生活中,我似乎無法理解這裏的問題。

+0

我們將需要看到比這更多的代碼。我假設你只有一個函數定義。您至少需要第二次,因爲只有傳入的號碼少於一次,您所顯示的號碼纔會匹配。 –

+0

啊,那可能是我的問題了 – Bitwise

回答

3

從你提供的代碼看起來你只有一個模塊,只有一個功能 - 這裏顯示的一個。我假設你有這樣的事情:

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 

將是有問題的,因爲fibwhen子句永遠不會匹配,因爲首先定義的限制性較小。

希望有幫助!