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

例如,使用模式匹配:

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


vs保护条款:

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


我的意思是两种方法都能产生相同的结果,但是一种解决方案是否比另一种更好?如果是这样,为什么呢?

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

最佳答案

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

def sign(x) when x  < 0, do: -1
def sign(x) when x == 0, do:  0
def sign(x) when x  > 0, do:  1


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

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

关于elixir - Elixir :模式匹配或守卫,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30589187/

10-13 06:13