with..do..else语句中的语法错误

时间:2017-03-05 16:49:14

标签: elixir phoenix-framework

我有一个语法错误,我不知道它来自哪里。这是我的函数(在persona_from_auth.ex中):

  # find or create the user.
  # if you login with oauth2, your account will auto created
  def find_or_create(%Auth{provider: :github} = auth) do
    with
      {:notfound} <- check_github_email(auth.info.email),
      {:notfound} <- check_google_email(auth.info.email)
    do
        create(auth)
    else
      {:ok, persona} -> update(auth, persona)
    end
  end

这会返回以下错误:

== Compilation error on file web/models/persona_from_auth.ex ==
** (SyntaxError) web/models/persona_from_auth.ex:18: syntax error before: do
    (elixir) lib/kernel/parallel_compiler.ex:117: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1

第18行是create()调用之前的行。

我检查了正确的灵丹妙药版本。在mix.exs中我得到了1.2,我将其改为1.4.2,但仍然是同样的错误。编译是否仍然可以使用1.2?我该如何检查?

1 个答案:

答案 0 :(得分:3)

with之后的第一个语句必须位于同一行,或者参数必须位于括号中,否则Elixir认为您正在尝试调用with/0,然后是以下行没有意义,导致语法错误。

以下任何一种都应该有效:

with {:notfound} <- check_github_email(auth.info.email),
     {:notfound} <- check_google_email(auth.info.email))
do
with(
  {:notfound} <- check_github_email(auth.info.email),
  {:notfound} <- check_google_email(auth.info.email)
) do