如何在不展平其内容的情况下迭代嵌套数组?

时间:2014-07-16 17:27:04

标签: ruby arrays enumerator

我有一对带有数字对的数组:

a = [[4, 6], [3, 0], [0, 0]]

当我这样做时:

a.each do |x|
  puts x
done

我得到一套扁平的值:

4
6
3
0
0
0

我想要的是值保持成对:

[4,6]
[3,0]
[0,0]

理想情况下,我想使用Enumerator进行迭代,因为我想在循环处理期间使用#peek

我发现:

e = a.each
loop do
  puts e.next
end

给出与上面的展平示例相同的输出,最后添加nil

有没有办法循环同时保持数组成对分组?

1 个答案:

答案 0 :(得分:4)

您只需使用p,而不是puts。阅读此p vs puts

Kernel#puts只是将数组视为一种特殊情况。它循环遍历项目并每行打印一个。我没有读过 source ,这只是我的理解。我刚从source确认,并发现我的理解是正确的: -

 io_puts_ary(VALUE ary, VALUE out, int recur)
6814 {
6815     VALUE tmp;
6816     long i;
6817 
6818     if (recur) {
6819         tmp = rb_str_new2("[...]");
6820         rb_io_puts(1, &tmp, out);
6821         return Qtrue;
6822     }
6823     ary = rb_check_array_type(ary);
6824     if (NIL_P(ary)) return Qfalse;
6825     for (i=0; i<RARRAY_LEN(ary); i++) {
6826         tmp = RARRAY_AREF(ary, i);
6827         rb_io_puts(1, &tmp, out);
6828     }
6829     return Qtrue;
6830 }

rb_io_puts说 -

  

将给定对象与IO#print一样写入 ios 。在任何尚未以换行符结束的语句之后写入记录分隔符(通常是换行符)。如果使用数组参数调用,则将每个元素写入新行。如果不带参数调用,则输出单个记录分隔符。