我有一对带有数字对的数组:
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
。
有没有办法循环同时保持数组成对分组?
答案 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 。在任何尚未以换行符结束的语句之后写入记录分隔符(通常是换行符)。如果使用数组参数调用,则将每个元素写入新行。如果不带参数调用,则输出单个记录分隔符。