erlang - 函数头中的映射模式匹配
问题描述
我正在尝试创建一个接受两个参数的函数,一个由三个元素组成的元组,以及一个将分配元组值中最后两个元素的映射。所以例如我会这样调用函数
modulename:funcName({description, a,b}, #{a=>1, b=>2)).
我无法让模式匹配工作。我的功能看起来像这样
funcName({description,a,b}, #{a:=A, b:=2}.
我无法将元组中的原子映射到映射中的值。我该怎么做。
解决方案
如果我正确理解了您想要的内容,则无法在函数头本身中执行此操作,因为必须事先绑定所有用作映射键的变量。来自OTP 23 亮点博客文章:
下面有一个非法示例,表明仍然不支持使用未绑定变量作为键模式表达式的一部分。在这种情况下,Key 未绑定,并且要求键表达式中使用的所有变量都必须事先绑定。
illegal_example(Key, #{Key := Value}) -> Value.
所以你必须写这样的东西:
func_name({description, Key1, Key2}, Map = #{}) ->
#{Key1 := Value1, Key2 := Value2} = Map,
....
这是有效的,因为在第二行,变量Key1
和Key2
已经绑定,因此它们可用于匹配映射中相应键的值。
或者,使用maps:get
来实现相同的结果:
func_name({description, Key1, Key2}, Map = #{}) ->
Value1 = maps:get(Key1, Map),
Value2 = maps:get(Key2, Map),
....