我有一个函数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
并且没有模式匹配吗?
答案 0 :(得分:3)
您应该首先声明一个设置默认参数的头:
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_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
可以帮助您将整个结构作为user
,因此您不需要在功能块中进行分配。
编辑:
Here's the exact comment说明代码的外观。