Elixir中如何向函数传递Map并正确完成模式匹配
问题原因
你定义的myFunction/1函数子句,模式匹配规则是接收单个符合结构的Map类型参数,但你实际传入的是包含多个Map的列表(List类型),参数类型和函数期望的匹配规则完全不匹配,因此触发no function clause matching报错。
注意:你写的针对单个Map的模式匹配语法本身没有错误,问题出在传参逻辑和函数定义的预期不匹配。
修正方法
根据你的使用场景二选一即可:
方案1:保持现有函数不变,调整调用方式,遍历列表时逐个传参
如果你只需要函数处理单个Map结构,就不要直接把整个列表传入函数,通过遍历操作把列表里的每个Map元素单独传给函数即可:
target_list = [ %{color: "green", index: 0}, %{color: "blue", index: 1} ] # 普通匿名函数写法 Enum.each(target_list, fn item -> myFunction(item) end) # 函数捕获简写写法 Enum.each(target_list, &myFunction/1)
执行后会依次打印"green"和"blue",符合预期。
方案2:新增列表匹配的函数子句,支持直接传入整个列表
如果你希望函数可以直接接收列表参数,就在原有函数基础上新增一个匹配列表类型的子句,在子句内部完成遍历逻辑:
# 原有处理单个Map的子句保持不变 def myFunction(%{color: color, index: index}) do IO.inspect(color) end # 新增处理列表的子句 def myFunction(items) when is_list(items) do Enum.each(items, &myFunction/1) end
调整后直接调用myFunction(target_list)即可正常执行,不需要在调用侧写遍历逻辑。
常见踩坑提示:如果你已经写了遍历逻辑但依然报错,检查是不是写错了遍历传参的写法,比如漏写匿名函数包装、错误写成
Enum.each(target_list, myFunction()),这类写法会直接把列表作为参数传给函数,依然会触发匹配错误。
内容的提问来源于stack exchange,提问作者Red Baron
相关产品推荐
相关产品推荐

