Elixir:模式匹配或保护

时间:2015-06-02 06:46:12

标签: elixir

我很好奇我在定义函数时应该使用模式匹配vs guard子句。

例如使用模式匹配:

defmodule Exponent do
  def power(value, 0), do: 1
  def power(value, n), do: value*power(value, n-1)
end

vs guard clause:

defmodule Exponent do
  def power(value, n) when n==0, do: 1
  def power(value, n), do: value*power(value, n-1)
end

我的意思是两者都产生相同的结果但是一种优先于另一种的解决方案?如果是这样,为什么呢?

我是Elixir的新手,所以这个问题的答案对我来说还不是很明显。提前谢谢。

1 个答案:

答案 0 :(得分:20)

防护比模式匹配更强大,但它们引入了一层可能不必要的复杂性。对于像您的示例中那样的简单相等检查,它们在性能方面应该是等效的。我建议首先尝试使用模式匹配,以保持简单。如果绝对必要,你可以回到保护条款。然而,当它有助于提高可读性时,可能偶尔会有意义,例如

def divisible?(x, divisor) when rem(x, divisor) == 0, do: true
def divisible?(_x, _divisor), do: false

我认为保护子句中等式运算符的“正确”用例是当它用作更复杂表达式的一部分时,例如

ids