看看里面有什么
arr[0]
# => [[[...], 1]]
arr[0]
是一个只有一个元素的数组。所以[1]
将超出这个数组并返回 nil。
arr[0][0]
# => [[[...]], 1]
arr[0][0]
将进入顶部数组的唯一一个元素,并且该元素包含两个值,因此[1]
将找到一个值。
它的行为是因为你做了arr[0] << arr
而不是arr[0] = arr
。
通过这样做arr = [[], 1]; arr[0] << arr
,您没有设置arr
为,arr[0]
而是添加arr
为 arr[0] 的元素,它本身就是一个数组。
如果你不这样做
arr = ["whatever", 1]
# => ["whatever", 1]
arr[0] = arr
# => [[...], 1]
arr[0][1]
# => 1
arr[0][0][1]
编辑
回到你的问题,为什么它会变成一个递归数组。您不是将arr
' 值传递给arr[0]
而是它的引用。
arr = ["whatever", 1]
# => ["whatever", 1]
arr.object_id
# => 69999412942060
arr[0] = arr
# => [[...], 1]
arr[0].object_id
# => 69999412942060
arr[0].object_id == arr.object_id
# => true
从那时起,您就拥有Ouroboros,arr
并且arr[0]
指的是同一个对象。
如果你只想插入它的值,你应该先 deep_copied 它。
arr = ["whatever", 1]
arr_copy = Marshal.load(Marshal.dump(arr)) # copy the value,
# delete the object reference dependence
arr[0] = arr_copy
puts arr.inspect
# [["whatever", 1], 1] # no infinit recurrence.