Elixir遍历二维数组时无法更新列表问题求助
问题原因及解决方法
错误原因
- 变量不可变性:Elixir是函数式语言,所有变量都是不可变的。你在
Enum.each的匿名函数里写的final_list = final_list ++ &1,只是在当前函数作用域内创建了一个同名新变量,完全不会影响外部定义的final_list。外部的final_list始终是初始的空列表,所以最后打印结果为空。 - 误用Enum.each:
Enum.each的作用是遍历集合执行副作用(比如打印),它不会返回新集合,不适合用来筛选和收集元素。 - 类型未判断:原数组中存在字符串类型的
"nil",直接和数字做比较会触发ArgumentError错误,必须先判断元素是否为整数类型。
正确实现方案
方案一:扁平化后筛选
先将二维数组展开为一维列表,再筛选出符合条件的元素:
list1 = [ [1 ,2,3,4,"nil"], [6,7,8,9,10], [11,"nil",13,"nil",15], [16,17,"nil",19,20] ] final_list = list1 |> Enum.flat_map(& &1) # 扁平化二维数组,等价于Enum.flat_map(fn row -> row end) |> Enum.filter(fn elem -> is_integer(elem) and elem >= 10 and elem <= 20 end) IO.inspect(final_list) # 输出: [10, 11, 13, 15, 16, 17, 19, 20]
方案二:逐行筛选后合并
先对每一行单独筛选符合条件的元素,再将所有结果合并为一维列表:
final_list = list1 |> Enum.map(fn row -> Enum.filter(row, fn elem -> is_integer(elem) and elem in 10..20 end) end) |> List.flatten()
关键提示
在Elixir中,不要试图修改变量的值,而是通过变换集合生成新值的方式处理数据。优先使用Enum.map、Enum.filter、Enum.flat_map这类返回新集合的函数,而非Enum.each。
内容的提问来源于stack exchange,提问作者Anshul Nigam
相关产品推荐
相关产品推荐

