每个看似递归到2D数组的第二维

Xen*_*non 2 ruby arrays iterator multidimensional-array

我偶然发现了在Ruby中迭代2维数组的这种方式:

[[1, 2], [3, 4]].each {|x| puts x}
Run Code Online (Sandbox Code Playgroud)

输出是:

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

我的问题很简单:为什么以及如何发生这种情况?为什么Array#each看似递归到第二个维度?为什么输出不如下?

[1, 2]
[3, 4]
Run Code Online (Sandbox Code Playgroud)

Xen*_*non 7

将代码更改为:

[[1, 2], [3, 4]].each {|x| puts x.to_s}
Run Code Online (Sandbox Code Playgroud)

给出预期的输出:

[1, 2]
[3, 4]
Run Code Online (Sandbox Code Playgroud)

事实证明,魔法正在发生IO#puts,而不是在Array#each.来自文档:

如果使用数组参数调用,则将每个元素写入新行.

因此IO#puts在给定数组参数时是递归的.