匿名函数的可见性和生命周期

Visibility and lifecycle of an anonymous function

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

  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 错误。代码有什么问题?

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

以下应该有效:

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

&用于捕获命名函数作为变量并将其作为函数参数传递,但不需要捕获匿名函数,因为它们已经可以在第一时间进行赋值。