0

我尝试过滤掉已删除的项目:

  defp react_to_event({:delete, item}, socket) do
    id = item.id

    filter_by_id = fn list ->
      Enum.filter(list, fn
        {:id, ^id} -> false
        _ -> true
      end)
    end

    {
      :noreply,
      socket
      |> update(:new_items, &filter_by_id/1)
      |> update(:items, &filter_by_id/1)
    }
  end

但似乎生命周期或范围在这里关闭:我在这里得到未使用的变量filter_by_id和未定义的函数filter_by_id错误。代码有什么问题?

4

1 回答 1

3

&filter_by_id/1将在您的模块(或导入的模块)中查找命名filter_by_id/1函数,而不是filter_by_id变量中包含的匿名函数。

以下应该有效:

{
  :noreply,
  socket
  |> update(:new_items, filter_by_id)
  |> update(:items, filter_by_id)
}

&用于捕获命名函数作为变量并将它们作为函数参数传递,但不需要捕获匿名函数,因为它们已经可以被赋值。

于 2021-02-01T23:37:19.053 回答