function print_ipairs(t)
print("in print_ipairs")
for k, v in ipairs(t) do
print(k)
end
end
function print_pairs(t)
print("in print_pairs")
for k, v in pairs(t) do
print(k)
end
end
a = {}
a={1,2,3,4,5,6,7,8,9,10}
print_ipairs(a)
a[2] = nil
a[3] = nil
a[4] = nil
a[6] = nil
a["k"] = "e"
print_ipairs(a)
print_pairs(a)
輸出為:
in print_ipairs
1
2
3
4
5
6
7
8
9
10
in print_ipairs
1
in print_pairs
1
7
8
10
k
5
9
在這里,首先對表a賦值,有1-10共十個元素,通過調用函數print_ipairs可知,這些元素都是存放在數組部分的,這是因為ipairs取的是Table的數組部分元素.
在這之后,人為的將其中2,3,4,6元素刪除,造成原來數組不滿一半元素被利用上的現象,然后再插入一個新key "k",以讓這個Table重新分配空間.再此之后,再次調用ipairs遍歷a的數組部分,可以看到只有1被打印出來了,也就是說,在重新分配空間之后,除去已經被刪除的2,3,4,6之外,只有1還在數組里面,剩下的5,7,8,9,10已經不在數組部分了.緊接著調用pairs遍歷這個表,可以看出這些已經不在數組部分的值又被打印出來了,并且它們的順序已經被打亂,不再按照數字大小順序來排列了,它們在這次重新分配中被挪動到了hash部分.
這個實驗既驗證了我們前面的分析,同時也告訴我們,Table的重新分配,實際上代價是很大的,因此不建議在實際程序中,一個Table即有數組部分,也有Hash部分,純粹一些,性能上會有提升.