首页 > 解决方案 > 函数头中的映射模式匹配

问题描述

我正在尝试创建一个接受两个参数的函数,一个由三个元素组成的元组,以及一个将分配元组值中最后两个元素的映射。所以例如我会这样调用函数

modulename:funcName({description, a,b}, #{a=>1, b=>2)).

我无法让模式匹配工作。我的功能看起来像这样

funcName({description,a,b}, #{a:=A, b:=2}.

我无法将元组中的原子映射到映射中的值。我该怎么做。

标签: erlangpattern-matching

解决方案


如果我正确理解了您想要的内容,则无法在函数头本身中执行此操作,因为必须事先绑定所有用作映射键的变量。来自OTP 23 亮点博客文章

下面有一个非法示例,表明仍然不支持使用未绑​​定变量作为键模式表达式的一部分。在这种情况下,Key 未绑定,并且要求键表达式中使用的所有变量都必须事先绑定。

illegal_example(Key, #{Key := Value}) -> Value.

所以你必须写这样的东西:

func_name({description, Key1, Key2}, Map = #{}) ->
    #{Key1 := Value1, Key2 := Value2} = Map,
    ....

这是有效的,因为在第二行,变量Key1Key2已经绑定,因此它们可用于匹配映射中相应键的值。

或者,使用maps:get来实现相同的结果:

func_name({description, Key1, Key2}, Map = #{}) ->
    Value1 = maps:get(Key1, Map),
    Value2 = maps:get(Key2, Map),
    ....

推荐阅读