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

Ecto查询返回nil时如何正确匹配Case语句的默认分支?

问题分析与解决方案

你的问题出在Elixir的case模式匹配逻辑上:当前代码里的question ->分支会匹配任何返回值,包括nil,所以_ ->分支永远不会被执行。当查询返回nil时,代码依然会进入第一个分支,后续尝试访问nil.game_id自然就会抛出"undefined function nil.game_id/0"的错误。

正确的写法

你需要明确区分「查询到Question结构体」和「返回nil」两种情况,通过模式匹配来实现:

def check_question(conn, _params) do
  case Repo.get_by(Question, active: true, closed: true) do
    # 仅匹配Question结构体实例,此时question是有效的数据
    %Question{} = question ->
      # 这里可以安全访问question的属性,比如question.game_id
      # 你的业务逻辑代码...
    # 匹配查询为空的情况
    nil ->
      # 处理没有找到数据的逻辑,比如返回提示、记录日志等
      # 你的空结果处理代码...
  end
end

为什么这样有效?

  • %Question{} = question是Elixir的结构体模式匹配,只有当Repo.get_by返回的是Question模块定义的结构体时,这个分支才会触发,保证question是一个有效的实例,不会出现nil。
  • nil ->分支专门捕获查询返回空的情况,此时你可以在这里处理空结果的业务逻辑,避免后续代码访问nil的属性。

如果你不确定是否只有这两种返回情况,也可以用_ ->代替nil ->,但因为Repo.get_by/3的返回值只会是「结构体实例」或「nil」,所以明确写nil ->会让代码可读性更高。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:40:48