Elixir:模式匹配或守卫
Elixir: Pattern Match or Guard
我很好奇在定义函数时什么时候应该使用模式匹配与保护子句。
例如模式匹配:
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
我想 "proper" 保护子句中相等运算符的用例是当它用作更复杂表达式的一部分时,例如
def divisible?(x, divisor) when rem(x, divisor) == 0, do: true
def divisible?(_x, _divisor), do: false
我很好奇在定义函数时什么时候应该使用模式匹配与保护子句。
例如模式匹配:
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
我想 "proper" 保护子句中相等运算符的用例是当它用作更复杂表达式的一部分时,例如
def divisible?(x, divisor) when rem(x, divisor) == 0, do: true
def divisible?(_x, _divisor), do: false