You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby中如何正确zip三个及以上数组并保留元素原有数据类型

问题原因

你错误的根源是连续调用了两次zip,导致结果产生了不必要的嵌套结构:

  1. 第一次调用a.zip(b)会得到嵌套数组:[[1,1], [2,2], [3,3]]
  2. 用这个结果再调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:27:03