模式匹配:优于开关案例的优势



我正在学习长生不老药,并且看不到图案匹配的优势比良好的开关情况。我想念什么?

简而言之,长生素的模式匹配case将使您专注于数据的形状。与其允许语言中的任何表达方式并寻找真实条件,还可以向读者展示数据中重要的考虑的形状。

更有意图。

长生不老药具有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

如您所见,实际上没有什么可以连接cond中的表达式。他们不必在相同的数据上采取行动。您也可以使用模式匹配中不允许的表达式。这两个方面都使cond非常灵活,但这也是代码的气味。没有连贯性。表达可以具有 side-effects 。我需要比case更仔细地查看cond

相比之下,case表达式让我非常明确地了解数据的形状。所有匹配都是在相同数据上完成的,因此它具有自然的凝聚力。它告诉读者很多关于作者对某些数据的期望。这是非常的意图揭示。它很快显示了作者期望数据的形状,以及应对不同对待的任何特殊情况。阅读case语句时,您也可以专注于数据。

模式匹配也可让您捕获图案的一部分。我在匹配模式中捕获了第二和第三列表元素。它们仅在case块内可用,不会"泄漏"出去。

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

案例语句实际上是模式匹配的。案例语句中的每场比赛都是匹配项,可用于提取比赛的段。此外,它支持警卫。例如:

case my_map do
  %{type: 1, data_for_1: data} -> "Data 1 is %{data}"
  %{type: 2, data_for_2: data} => "Data 2 is %{data}"
  map -> "No matching type found: %{inspect map}"
end

现在,也许您打算问,使用案例比多个功能头的优势是什么?

在这种情况下,这是一个样式/偏好问题。但是,它确实会减少功能的大小。我更喜欢多功能原因方法,尤其是当每个代码块大。

最新更新