Ruby 如何迭代嵌套数组而不展平其内容?

Ruby 如何迭代嵌套数组而不展平其内容?,ruby,arrays,enumerator,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] 理想情况下,我希望使用枚举器进行迭代,因为我希望在循环处理期间使用#peek 我发现: e = a.each loop do puts e.next end 给出了与上面展平示例相同的输出,并在末尾添加了一个nil 有没有一

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

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]
理想情况下,我希望使用
枚举器进行迭代,因为我希望在循环处理期间使用
#peek

我发现:

e = a.each
loop do
  puts e.next
end
给出了与上面展平示例相同的输出,并在末尾添加了一个
nil


有没有一种方法可以在循环的同时保持数组成对分组?

您只需要使用
p
,而不是
put
。读这个

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

 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 }
io\u-put\u-ary(VALUE-ary、VALUE-out、int-recur)
6814 {
6815值tmp;
6816长i;
6817
6818如果(再次发生){
6819 tmp=rb_str_new2(“[…]”);
6820 rb_io_输出(1和tmp输出);
6821返回Qtrue;
6822     }
6823 ary=rb\U校验\U数组\U类型(ary);
6824如果(无)返回Qfalse;

6825对于(i=0;i您只需要使用
p
,而不是
put
。请阅读此内容

Kernel#put
只是将数组视为一种特殊情况。它在项目上循环并每行打印一个。我没有阅读源代码,这只是我的理解。我刚刚从中确认,发现我的理解是正确的:-

 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 }
io\u-put\u-ary(VALUE-ary、VALUE-out、int-recur)
6814 {
6815值tmp;
6816长i;
6817
6818如果(再次发生){
6819 tmp=rb_str_new2(“[…]”);
6820 rb_io_输出(1和tmp输出);
6821返回Qtrue;
6822     }
6823 ary=rb\U校验\U数组\U类型(ary);
6824如果(无)返回Qfalse;

6825(i=0;iAs Arup的回答说,您已经获得成对的分组,但是
puts
将在单独的行上打印数组元素。尝试
放置一个
,看看您得到了什么。正如Arup的回答所说,您已经获得成对的分组,但是
puts
将在单独的行上打印数组元素。尝试
putsa
看看你得到了什么。谢谢,我想这让我渡过了难关!谢谢,我想这让我渡过了难关!