为什么在 Elixir 中匹配地图时没有匹配错误

问题描述 投票:0回答:1

我正在从官方文档学习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。

elixir
1个回答
0
投票

处理元组时,提供适合整个元组结构的模式至关重要。您可以使用下划线 _ 作为包罗万象,但它需要覆盖元组中的所有元素。处理列表时,您可以匹配所有元素,例如 [a, b, c] = [1, 2, 3],或者使用 [h|t] = [1, 2, 3] 来处理头和尾。但是,使用映射,您可以灵活地匹配一个或多个键,从而允许使用 %{a: b} = %{a: :foo, b: :bar} 等模式。

这些数据结构之间的语义差异是有道理的。仅当两个元组具有相同数量的元素时,元组规则才确保匹配。列表也有类似的限制,但由于访问头部是常见操作,因此以 [h|t] 语法为准。另一方面,地图可以根据特定的键进行匹配,从而使元素的数量变得不重要。只要双方包含相同的键和值的可选模式,就被认为是成功的匹配。

© www.soinside.com 2019 - 2024. All rights reserved.