我正在从官方文档学习Elixir。
我对 Elixir 模式匹配的理解有点困惑。请看下面的例子。
[_] = [1,2,3]
给予
(MatchError) no match of right hand side value: [1, 2, 3]
(stdlib 5.0.2) erl_eval.erl:498: :erl_eval.expr/6
iex:32: (file)
但是为什么下面的代码没有产生这样的错误。我感觉我失去了一些东西。
%{name: person_name} = %{name: "Fred", favorite_color: "Taupe"}
给予
%{name: "Fred", favorite_color: "Taupe"}
我什么也没做。我问过chatgpt。
处理元组时,提供适合整个元组结构的模式至关重要。您可以使用下划线 _ 作为包罗万象,但它需要覆盖元组中的所有元素。处理列表时,您可以匹配所有元素,例如 [a, b, c] = [1, 2, 3],或者使用 [h|t] = [1, 2, 3] 来处理头和尾。但是,使用映射,您可以灵活地匹配一个或多个键,从而允许使用 %{a: b} = %{a: :foo, b: :bar} 等模式。
这些数据结构之间的语义差异是有道理的。仅当两个元组具有相同数量的元素时,元组规则才确保匹配。列表也有类似的限制,但由于访问头部是常见操作,因此以 [h|t] 语法为准。另一方面,地图可以根据特定的键进行匹配,从而使元素的数量变得不重要。只要双方包含相同的键和值的可选模式,就被认为是成功的匹配。