理解Elixir中的保护条款

时间:2017-06-23 19:39:26

标签: elixir

我正试图在Elixir中实施一个保护条款。

这就是我要做的事情:

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

但是当我测试时,会出现此错误:

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

对于我的生活,我似乎无法理解这里的问题。

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子句永远不会匹配,因为首先定义的限制较少。

希望有所帮助!