Elixir 具有多个子句,并在一个或多个子句中定义默认值
我有一个函数confirm_user,可以用参数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
%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
通过模式匹配,帮助您获得作为用户的整个结构,因此不需要在功能块中赋值
编辑:
解释你的代码应该是什么样子