【发布时间】:2014-04-29 03:01:53
【问题描述】:
此代码在 Ruby 中有效
a = [5,10,15]
[5,10,15]
a.push a
[5,10,15,[...]]
导致第四个数组槽指向数组本身,(似乎)无限。为什么 Ruby 允许这样做,并且该功能是否提供任何实际应用程序?
【问题讨论】:
-
我能想到的最简单的例子是垃圾收集器——你保留一个对内存中每个对象的引用列表(包括那个列表!)
此代码在 Ruby 中有效
a = [5,10,15]
[5,10,15]
a.push a
[5,10,15,[...]]
导致第四个数组槽指向数组本身,(似乎)无限。为什么 Ruby 允许这样做,并且该功能是否提供任何实际应用程序?
【问题讨论】:
由于在 Ruby 中一切都是对象,因此变量只是指向对象(更严格地说,是内存位置)。数组是此类指针的集合,这意味着它可以存储指向自身的指针。这不是 Ruby 中添加的额外功能,实际上是不允许添加的额外功能。
关于应用,请查看“What are recursive arrays good for?”(有向图表示)。
但是请注意,这样的数组不是无限的:
a = []
a << a
a.length = 1
【讨论】:
由于 Ruby 是一门动态语言,数组本质上是“任何对象”的集合,因此您可以将任何您想要的东西放入其中,包括其他数组,包括(在这种情况下)对自身的引用。就像 Java 中的 ArrayList<Object> 一样,它可以做同样的事情(你可以将其添加到自身,但为什么呢?)
递归结构有时可能很有用,但什么都没有想到。
【讨论】: