Compiler errors 长生不老药:为什么我会得到;“未定义函数”;错误?

Compiler errors 长生不老药:为什么我会得到;“未定义函数”;错误?,compiler-errors,elixir,ecto,Compiler Errors,Elixir,Ecto,Elixir编译器在函数的第三行给出了“undefined function changes/0”: def ignore_empty(changeset) do cond do %{valid?: false, changes: changes} = changeset when changes == %{} -> %{changeset | action: :ignore} true -> changeset en

Elixir编译器在函数的第三行给出了“undefined function changes/0”:

  def ignore_empty(changeset) do
    cond do
      %{valid?: false, changes: changes} = changeset when changes == %{} -> 
        %{changeset | action: :ignore}
      true -> changeset  
    end    
  end 

为什么呢?我主要是从cast_assoc函数的exto.Changeset文档中复制了这段代码

您可能打算使用
case
,例如

def ignore_empty(changeset) do
  case changeset do
    %{valid?: false, changes: changes} = changeset when changes == %{} ->
      %{changeset | action: :ignore}
    _ ->
      changeset
  end
end

得到“undefined function”的原因是,当表达式展开时,这恰好是编译器遇到的第一个错误。将表达式放在
条件下是有效的,因此除了对未定义函数的引用
发生更改之外,另一件它将失败的事情是在
时使用
。无论如何,这似乎是这里的问题。

您可能打算使用
case
,例如

def ignore_empty(changeset) do
  case changeset do
    %{valid?: false, changes: changes} = changeset when changes == %{} ->
      %{changeset | action: :ignore}
    _ ->
      changeset
  end
end

得到“undefined function”的原因是,当表达式展开时,这恰好是编译器遇到的第一个错误。将表达式放在
条件下是有效的,因此除了对未定义函数的引用
发生更改之外,另一件它将失败的事情是在
时使用
。无论如何,这似乎是这里的问题。

谢谢,比特沃克,你说得对,我很困惑,因为在文档中,case表达式的changeset参数通过了管道操作符,我认为有一个cond表达式,这是我的错。谢谢,比特沃克,你说得对,我感到困惑,因为在文档中,case表达式的changeset参数通过管道操作符,我认为有一个cond表达式,我的错误。