有人告诉我这里发生了什么:
a = [0,1,2]
a.each {|x| a[x] = a}
结果是[[...], [...], [...]]
。如果我评估a[0]
我得到[[...], [...], [...]]
. 如果我评估a[0][0]
,我会[[...], [...], [...]]
无限期地得到。
我是否创建了一个无限维数组?这应该如何/为什么会起作用?
基本上,您已经修改了其中的每个元素a
以引用列表本身。该列表递归地引用自身:
a[0] # => a
a[0][0] # => a[0], which is a
a[0][0][0] # => a[0][0], which is a[0], which is a
...
(# =>
是“这条线计算为”的Rubyism)
取决于你如何看待它,它不是无限的。它或多或少就像一张纸,两面都写着“请翻过来”。
Ruby 打印的原因[...]
是它足够聪明地发现列表是递归的,并且避免进入无限循环。
顺便说一句,你的用法each
有点不习惯。each
返回列表,并且您通常不会将此返回值分配给变量(因为a
在这种情况下您已经有一个引用它的变量)。换句话说,您的代码分配[0,1,2]
给a
,然后循环a
(将每个元素设置为a
),然后分配a
给a
。
我认为这是一个自我引用的数据结构。a[x]=a 将 a 的指针放在 a[x] 中。