Elixir:模式匹配或保护

are*_*555 17 elixir

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

例如,使用模式匹配:

defmodule Exponent do
  def power(value, 0), do: 1
  def power(value, n), do: value*power(value, n-1)
end
Run Code Online (Sandbox Code Playgroud)

vs护卫条款:

defmodule Exponent do
  def power(value, n) when n==0, do: 1
  def power(value, n), do: value*power(value, n-1)
end
Run Code Online (Sandbox Code Playgroud)

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

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

Pat*_*ity 21

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

def sign(x) when x  < 0, do: -1
def sign(x) when x == 0, do:  0
def sign(x) when x  > 0, do:  1
Run Code Online (Sandbox Code Playgroud)

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

def divisible?(x, divisor) when rem(x, divisor) == 0, do: true
def divisible?(_x, _divisor), do: false
Run Code Online (Sandbox Code Playgroud)