我有一个cronjob,每天晚上9点运行一个功能。这个函数做的第一件事是进行ecto查询。但是,查询有可能返回空白。如果它发生,我希望能够处理这种情况。
def check_question(conn, _params) do
case Repo.get_by(Question, active: true, closed: true) do
question ->
_ ->
end
end
但这不起作用,因为如果查询为nil则会抛出此错误:
function nil.game_id/0 is undefined or private
它基本上试图检查下一个函数中的零问题,但显然它会因为问题为零而中断。
如果repo查询返回nil,如何将其路由到_ case?
答案 0 :(得分:3)
凯斯将尝试从上到下进行匹配。所以在你的代码中,首先尝试匹配nil,然后尝试匹配nil。如果你想匹配结果不是nil的情况,请使用when not is_nil(question)
def check_question(conn, _params) do
case Repo.get_by(Question, active: true, closed: true) do
question when not(is_nil(question)) ->
_ ->
end
end
或没有when
def check_question(conn, _params) do
case Repo.get_by(Question, active: true, closed: true) do
nil -> ... case when result is nil
question ->
... case when there is result
end
end
还有一件事,无论何时编写没有任何分解或布尔检查的情况,它都与数学_ -> ...
表达式相同。 _
和question
之间的区别仅在于您不希望将匹配值分配给局部变量。因此,在您的尝试中,_ ->
将匹配NEVRER,因为question -> ...
将始终匹配,并且两种情况实际上都是相同的表达式。当您尝试编译该文件时,您可能会在控制台中看到该警告。所以总是尝试分解并检查/匹配表达式中的某些值!