【问题标题】:Understanding guard clauses in Elixir了解 Elixir 中的保护子句
【发布时间】:2017-06-23 19:39:25
【问题描述】:

我正在尝试在 Elixir 中实现一个保护子句。

这就是我想要做的:

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

但是当我测试这个时,出现了这个错误:

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

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

【问题讨论】:

  • 我们需要看到比这更多的代码。我假设您只有一个函数定义。您至少需要第二个,因为您显示的只有在传入的数字小于 1 时才匹配。
  • 啊,那可能是我的问题

标签: elixir


【解决方案1】:

从您提供的代码看来,您的模块只有一个功能 - 此处显示的功能。我假设你有这样的事情:

defmodule MyModule do
  def fib(n) when n < 1, do: n
end

所以,如果你运行如下代码:

MyModule.fib(1)

这将失败。这是因为您的fib/1 无法匹配,因为它有这个保护子句when n &lt; 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

会有问题,因为fibwhen 子句永远不会匹配,因为首先定义了限制较少的子句。

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2021-05-26
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多