Elixir中匹配Map为何不触发MatchError错误?
Elixir模式匹配:列表与Map的匹配差异解析
列表的严格匹配规则
看你写的这段代码:
[_] = [1,2,3]
模式[_]表示匹配长度恰好为1的列表,但右边的[1,2,3]是长度为3的列表,结构完全不匹配,所以触发了MatchError。
Elixir里列表的模式匹配是完全严格的:不仅每个位置的元素要符合对应模式,整个列表的长度也必须和模式一致。比如换成[first, _, third] = [1,2,3]就能成功匹配,因为两边长度相同,每个位置的占位符都能对应上。
Map的部分匹配特性
再看这段Map匹配的代码:
%{name: person_name} = %{name: "Fred", favorite_color: "Taupe"}
Map的模式匹配是部分匹配:只要左边模式里声明的所有键,在右边的Map中都存在且对应值能匹配,就算匹配成功,右边Map里的额外键不会影响结果。
这个模式只要求目标Map包含:name键,不管它还有没有favorite_color这类其他键。所以匹配成功后,person_name会被绑定为"Fred",同时整个表达式返回右边的完整Map,也就是你看到的%{name: "Fred", favorite_color: "Taupe"}。
核心差异总结
- 列表模式:完全结构匹配,长度和每个元素位置都要严格对应;
- Map模式:部分匹配,仅校验模式中指定的键,忽略额外键。
内容的提问来源于stack exchange,提问作者dinesh_pandikona
相关产品推荐
相关产品推荐

