有人告诉我这里发生了什么:
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] 中。