学习Ruby:通过阻止滥用来制作无限维数组

时间:2011-01-17 19:30:21

标签: ruby block

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

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

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

我创建了一个无限维度的数组吗?如何/为什么这可能起作用?

2 个答案:

答案 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]中。