我正试图在Elixir中实施一个保护条款。
这就是我要做的事情:
def fib(n) when n < 1, do: n
但是当我测试时,会出现此错误:
** (FunctionClauseError) no function clause matching in ProjectEuler.fib/1
对于我的生活,我似乎无法理解这里的问题。
答案 0 :(得分:4)
从您提供的代码看起来您有一个只有一个功能的模块 - 此处显示的模块。我假设你有类似的东西:
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)
调用正确的定义。
您需要注意 - 使用此技术时,VM将尝试匹配参数分析函数定义,以便它们在模块中定义,因此:
defmodule MyModule do
def fib(n), do: fib(n-1) + fib(n-2)
def fib(n) when n < 1, do: n
end
会有问题,因为fib
when
子句永远不会匹配,因为首先定义的限制较少。
希望有所帮助!