Guard子句使我们能够在执行函数之前检查参数。卫队的条款通常是首选if,并cond由于其可读性,并做出了一定的优化技术编译器更容易。执行所有保护匹配的第一个函数定义。
这是使用保护和模式匹配的阶乘函数的示例实现。
defmodule Math do def factorial(0), do: 1 def factorial(n) when n > 0: do: n * factorial(n - 1) end
当(且仅当)参数为时,第一个模式匹配0。如果参数不是0,则模式匹配失败,并检查下面的下一个函数。
第二个函数定义具有一个保护子句:when n > 0。这意味着仅当参数n大于时,此函数才匹配0。毕竟,没有为负整数定义数学阶乘函数。
如果两个函数定义(包括它们的模式匹配和保护子句)都不匹配,FunctionClauseError则将引发a。当我们传递一个负数作为参数时,此函数会发生这种情况,因为它不是为负数定义的。
注意,这FunctionClauseError本身并不是错误。返回-1或返回0某些其他语言中常见的“错误值”将隐藏您调用了未定义函数的事实,隐藏了错误的根源,可能为将来的开发人员造成巨大的麻烦。