Ruby中如何正确zip三个及以上数组并保留元素原有数据类型
问题原因
你错误的根源是连续调用了两次zip,导致结果产生了不必要的嵌套结构:
- 第一次调用
a.zip(b)会得到嵌套数组:[[1,1], [2,2], [3,3]] - 用这个结果再调用
zip(c),得到的最终结构是:[[[1,1], "a"], [[2,2], "b"], [[3,3], "c"]]
这种结构下遍历每个元素只会得到2个值:第一个是前两个数组合并的子数组,第二个是c数组的对应元素,你声明了3个遍历参数l1,l2,l3,第三个参数自然会被赋值为nil,也就出现了你看到的类型异常。
正确解法
Ruby的zip方法原生支持传入多个数组参数,不需要嵌套调用,直接把要合并的所有数组都传入zip即可:
a = [1,2,3] b = [1,2,3] c = ['a','b','c'] a.zip(b, c).each do |l1, l2, l3| puts l1.class, l2.class, l3.class end
运行后输出符合预期:
Integer Integer String Integer Integer String Integer Integer String
如果你确实需要分两次调用zip,也可以在遍历时对嵌套的第一个参数做解构,写法如下:
a.zip(b).zip(c).each do |(l1, l2), l3| puts l1.class, l2.class, l3.class end
这种写法也能得到和上面完全一致的结果,但可读性不如直接传多参数的写法,更推荐第一种方案。
内容的提问来源于stack exchange,提问作者aerijman
相关产品推荐
相关产品推荐

