有人告诉我这里发生了什么:
a = [0,1,2]
a.each {|x| a[x] = a}
结果是[[...], [...], [...]]
。如果我评估a[0]
,我会[[...], [...], [...]]
。如果我评估a[0][0]
,我会无限期地[[...], [...], [...]]
。
我创建了一个无限维度的数组吗?如何/为什么这可能起作用?
答案 0 :(得分:3)
基本上你已经修改了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
分配给{{1} }}
答案 1 :(得分:1)
我认为这是一种自引用数据结构。 a [x] = a将指针放在[x]中。