You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elixir模式匹配未匹配变量设为nil及Plug多控制器适配问题

解决Plug中模式匹配的MatchError问题,以及如何给未匹配变量设默认值

嘿,这个问题我之前也碰到过!核心原因是Elixir的模式匹配是严格匹配的:当你写%{params: %{"param1" => param01, "param2" => param02}} = conn时,它要求conn的params里必须同时存在"param1"和"param2"这两个键,少一个就会抛出MatchError,这就是第二个控制器报错的原因。

方法一:用模式匹配的默认值操作符\\设置nil

Elixir的模式匹配支持给map的键设置默认值,用\\符号就能实现“没匹配到就设为nil”的需求,修改你的匹配代码如下:

%{params: %{"param1" => param01, "param2" => param02 \\ nil}} = conn

这样一来:

  • 当params里有"param2"时,param02会取对应的值
  • 当params里没有"param2"时,param02会自动设为nil,不会触发MatchError

而且这个写法还保留了对"param1"的强制检查——如果某个请求连"param1"都没有,还是会抛出MatchError,这其实是个优点:可以确保必填参数存在。如果"param1"也是可选的,你同样可以给它加默认值:

%{params: %{"param1" => param01 \\ nil, "param2" => param02 \\ nil}} = conn

方法二:用Map.get/3灵活获取参数

如果你的参数较多,或者不想用模式匹配的语法,也可以先取出params,再逐个获取参数:

params = conn.params
param01 = params["param1"] # 这里如果param1不存在会返回nil
param02 = Map.get(params, "param2") # 等价于Map.get(params, "param2", nil)

这种写法更直观,也更灵活,适合参数结构不固定的场景。

总结

  • 模式匹配中可以用\\给键设置默认值,实现“未匹配变量设为nil”的需求
  • 严格模式匹配适合校验必填参数,而Map.get/3更适合灵活获取可选参数

内容的提问来源于stack exchange,提问作者Khaino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:26:24