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

问题描述

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

  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)
}

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