【问题标题】:Elixir: Pattern Match or GuardElixir:模式匹配或守卫
【发布时间】:2015-08-15 20:07:42
【问题描述】:

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

以模式匹配为例:

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 的新手,所以这个问题的答案对我来说还不是很明显。提前致谢。

【问题讨论】:

  • 您是否发现一种构造与另一种构造有任何性能差异?问一个是否比另一个更受欢迎,这让我觉得这是一个很好的例子,如果没有性能差异,就需要一个意见。投票结束。
  • 老实说,我太新了,我还没有发现如何对这种东西进行基准测试......我也没有看到类似的问题,所以我决定明确提出。
  • 一种实现与另一种实现之间可能存在差异,但没有任何上下文很难判断。现在你在问一个类似于“香蕉和草莓哪个更好?”的问题
  • 我想,与其要求“首选”解决方案,我应该问的是出于性能原因首选哪个解决方案(因为它们都完成了相同的最终结果)。

标签: elixir


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-03-01
    • 1970-01-01
    • 2017-06-23
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多