我很好奇何时定义函数时应该使用模式匹配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/