模式匹配:优于开关盒?

tld*_*ldr 3 elixir pattern-matching

我正在学习Elixir,并且看不到模式匹配优于好的开关盒的优势.我错过了什么?

Mar*_*lin 7

简而言之,Elixir的模式匹配case将使您专注于数据的形状.您不必在语言中使用任何表达式,并寻找真实条件,而是向读者展示数据中需要考虑的重要形状.更有意思的是揭露.

Elixir有casecond.前者获取一个值并在其上运行不同的模式匹配.后者不会取值,而是会评估一些表达式,直到找到一个真实的表达式.cond像是一样的作品if … elseif … else.

list = [3,2,1]
string = "abc"

case list do
  []        -> :empty             # won't match
  [1 | t]   -> :starts_with_one   # won't match
  [3, b, c] -> "3, #{b} and #{c}" # match!
  _         -> :fallback          # _ would match anything
end

cond do
  List.last(list) == 2     -> :two_at_the_end # false
  length(string) == 3      -> :three_letters  # true
  true                     -> :fallback
end
Run Code Online (Sandbox Code Playgroud)

如你所见,实际上没有任何东西可以连接表达式cond.他们不必对相同的数据采取行动.您还可以使用模式匹配中不允许的表达式.这两个方面都cond非常灵活,但它也是一种代码味道.有没有连贯性,以块.表达式可能有副作用.我需要更仔细地看待一个而cond不是一个case.

相比之下,case表达式让我非常明确地推断出数据的形状.所有匹配都在相同的数据上完成,因此它具有自然的内聚力.它告诉读者很多关于作者对某些数据的期望.这是非常有意的揭露.它可以快速显示作者期望数据采用的形状,以及应该区别对待的任何特殊情况.阅读case声明时,您也可以专注于数据.

模式匹配还可以捕获模式的部分.我捕获匹配模式中的第二个和第三个列表元素.它们只在case块内可用,不会"泄漏".

模式匹配中允许的受限制表达式也意味着它通常非常快.