gpt4 book ai didi

pattern-matching - 模式匹配 : advantage over switch-case?

转载 作者:行者123 更新时间:2023-12-04 07:25:49 24 4
gpt4 key购买 nike

我正在学习 Elixir,看不出模式匹配相对于好的 ol' switch case 的优势。我错过了什么?

最佳答案

简而言之,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

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

相比之下,case 表达式让我可以非常明确地推断我的数据的形状。所有的匹配都是在同一个数据上进行的,因此具有天然的内聚性。它告诉读者很多关于作者对某些数据的期望。这非常意图暴露。它可以快速显示作者期望数据呈现的形状,以及任何应该区别对待的特殊情况。阅读 case 语句时,您也可以专注于数据。

模式匹配还可以让您捕捉部分模式。我捕获了匹配模式中的第二个和第三个列表元素。它们仅在 case block 内可用,不会“泄漏”出去。

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

关于pattern-matching - 模式匹配 : advantage over switch-case?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37955462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com