Elixir报错Enum.filter/3未定义或私有,求解决方案
排查Elixir中「Enum.filter/3 is undefined or private」错误
直接错误原因
Enum.filter 只有两个参数:第一个是要过滤的枚举集合,第二个是判断元素是否保留的匿名函数,根本不存在Enum.filter/3这个函数。你在store里调用时传了三个参数(IO.puts(list)的返回值、list、匿名函数),这就是报错的直接原因。
代码里的其他逻辑问题
除了上述错误,你的代码还有几个明显问题:
store函数里的变量赋值逻辑混乱:先把list设为空列表,立刻又赋值成单个cell值,后续操作的是单个值而非列表。IO.puts(list)执行后会返回:ok(这是Elixir IO函数的固定返回值),你把:ok传给Enum.filter,但:ok不是可枚举的集合,就算参数数量对了也会报错。valid_sum里的for循环没有收集结果,而且调用store的方式根本没法把符合条件的元素攒成新列表。
修正后的代码
我们可以简化逻辑,直接在valid_sum里完成过滤和收集,不需要单独的store函数:
def matrix_of_sum do [ [21, "na", "na", "na", 12], ["na", "na", 12, "na", "na"], ["na", "na", "na", "na", "na"], [17, "na", "na", "na", "na"], ["na", 22, "na", -1, "na"] ] end def valid_sum do # 先把二维矩阵扁平化,再过滤符合条件的元素 matrix_of_sum() |> List.flatten() |> Enum.filter(fn cell -> cell != "na" && cell > 0 end) end
如果一定要保留store函数来处理单个元素,修正后的写法如下(注意Elixir是不可变语言,不能直接修改列表,要返回新值):
def matrix_of_sum do [ [21, "na", "na", "na", 12], ["na", "na", 12, "na", "na"], ["na", "na", "na", "na", "na"], [17, "na", "na", "na", "na"], ["na", 22, "na", -1, "na"] ] end def valid_sum do # 用for推导式直接筛选并收集元素 for row <- matrix_of_sum(), cell <- row, cell != "na" && cell > 0, do: cell end # 处理单个元素的store函数 def store(cell) do IO.puts(cell) # 执行你需要的打印操作 cell # 返回元素,方便后续收集 end # 如果需要用store处理每个符合条件的元素 def valid_sum_with_store do matrix_of_sum() |> List.flatten() |> Enum.filter(fn cell -> cell != "na" && cell > 0 end) |> Enum.map(&store/1) end
关键知识点提醒
- Elixir是不可变语言,所有数据不能直接修改,必须通过返回新值来更新。
Enum.filter/2的正确用法是:第一个参数传可枚举集合(比如列表),第二个参数传匿名函数,函数返回true的元素会被保留。- for推导式可以直接通过末尾的条件筛选元素,
do: 变量会自动把符合条件的变量收集成列表返回。
内容的提问来源于stack exchange,提问作者Jadu
相关产品推荐
相关产品推荐

