Elixir中如何在Map.update中使用外部定义的非lambda函数?
解决Map.update报错要求零元函数的问题
哈哈,太懂这种明明觉得逻辑没问题,却被报错卡半天的疲惫感了!我来帮你捋清楚这个问题~
你说得没错,Map.update/4确实是需要一个一元函数来接收当前值并返回新值的,报错说找不到xxx/0(零元函数),大概率是你传函数的方式错了,而不是函数本身的问题。
问题出在哪?
你可能不小心把函数调用当成了函数引用传给Map.update了。举个例子:
假设你定义了这样的一元函数:
def increment(val), do: val + 1
如果你写了下面的代码,就会触发你遇到的错误:
Map.update(%{}, :count, 0, increment()) # 报错:function increment/0 is undefined
因为increment()是在立即调用这个函数,此时Elixir会找一个没有参数的increment/0,但你只定义了increment/1,自然就报错了。
正确的传参方式
Map.update需要的是一个函数本身,而不是函数执行后的结果,有两种常见的正确写法:
- 使用函数捕获语法:用
&符号加函数名和元数来引用函数
Map.update(%{}, :count, 0, &increment/1)
- 用匿名函数包裹:把你的函数调用放在匿名函数里,让
Map.update能拿到当前值并传给它
Map.update(%{}, :count, 0, fn current_val -> increment(current_val) end)
这样Map.update就会在找到:count键的时候,把当前值传给你的一元函数,用返回的新值更新map,完全符合你原本的预期~
这种小细节确实容易在疲惫的时候忽略,休息会儿再看就一目了然啦!
内容的提问来源于stack exchange,提问作者xji
相关产品推荐
相关产品推荐

