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

时间:2017-10-30 18:46:06

标签: 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/2 has multiple clauses and defines defaults in one or more clauses

为什么呢?是%User{} = user并且没有模式匹配吗?

1 个答案:

答案 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说明代码的外观。