1

有人告诉我这里发生了什么:

a = [0,1,2]
a.each {|x| a[x] = a}

结果是[[...], [...], [...]]。如果我评估a[0]我得到[[...], [...], [...]]. 如果我评估a[0][0],我会[[...], [...], [...]]无限期地得到。

我是否创建了一个无限维数组?这应该如何/为什么会起作用?

4

2 回答 2

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),然后分配aa

于 2011-01-17T19:38:57.477 回答
1

我认为这是一个自我引用的数据结构。a[x]=a 将 a 的指针放在 a[x] 中。

于 2011-01-17T19:31:49.147 回答