Elixir 具有多个子句,并在一个或多个子句中定义默认值

Elixir 具有多个子句,并在一个或多个子句中定义默认值,elixir,Elixir,我有一个函数confirm_user,可以用参数%user{}或nil调用它 def confirm_user(%User{} = user, attrs \\ %{}) do Repo.update(User.confirm_changeset(user, attrs)) end def confirm_user(nil, attrs \\ %{}) do {:error, :not_found} end 但根据这个定义,我得到了一个错误: def confirm_user

我有一个函数confirm_user,可以用参数
%user{}
nil
调用它

def confirm_user(%User{} = user, attrs \\ %{}) do
    Repo.update(User.confirm_changeset(user, attrs))
end

def confirm_user(nil, attrs \\ %{}) do
    {:error, :not_found}
end
但根据这个定义,我得到了一个错误:

def confirm_user/2 has multiple clauses and defines defaults in one or more clauses

为什么??
%User{}=User
和nil是否不匹配?

您应该首先声明一个设置默认参数的头:

def confirm_user(_user, attr \\ %{})
def confirm_user(%User{} = user, attrs) do
  user
  |> User.confirm_changeset(attrs)
  |> Repo.update() 
end

def confirm_user(nil, attrs) do
  {:error, :not_found}
end
您还可以使用更明确的方法,自己声明
confirm\u user/1
——这就是
\
操作符实际正在做的事情

def confirm_user(user) do
  confirm_user(user, %{}) # call confirm_user/2 when no attrs are provided
end

def confirm_user(%User{} = user, attrs) do
  user
  |> User.confirm_changeset(attrs)
  |> Repo.update() 
end

def confirm_user(nil, attrs) do
  {:error, :not_found}
end
%User{}=User
通过模式匹配,帮助您获得作为
用户的整个结构,因此不需要在功能块中赋值

编辑:

解释你的代码应该是什么样子