登录Elixir - 包含多个子句的编译错误定义 -

时间:2017-01-22 02:49:01

标签: login compilation elixir

我正在尝试使用elixir登录,但是当我输入此代码时:

def changeset(model, params \\ :empty) do
   model
   |> cast(params, ~w(email), [])
   |> validate_format(:email, ~r/@/)
end

我一直收到这个错误:

== Compilation error on file web/models/user.ex ==
** (CompileError) web/models/user.ex:25: definitions with multiple clauses and default values require a header. Instead of:

def foo(:first_clause, b \\ :default) do ... end
def foo(:second_clause, b) do ... end

one should write:

def foo(a, b \\ :default)
def foo(:first_clause, b) do ... end
def foo(:second_clause, b) do ... end

def changeset/2 has multiple clauses and defines defaults in one or more clauses
web/models/user.ex:25: (module)
(stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
(elixir) lib/kernel/parallel_compiler.ex:117: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1

我知道我必须放一个标题,但我不确切知道如何修复它,有人可以解释我吗?

1 个答案:

答案 0 :(得分:2)

您的代码可能看起来像这样:

def changeset(model, params \\ :empty) do
   # ...
end

def changeset(model, %{"some" => value}) do
   # ...
end

Elixir抱怨这一点,因为拥有带默认值的多个子句可能会导致含糊不清。为了在语法级别上防止出现这种情况,Elixir强制使用单独的函数头作为默认值。

如错误消息所示,您需要添加一个单独的函数头定义默认值,然后编写其他子句而不使用默认值:

# This is a function header, whose only purpose is to set
# default values that apply to all subsequent clauses
def changeset(model, params \\ :empty)

def changeset(model, params) do
   # ...
end

def changeset(model, %{"some" => value}) do
   # ...
end