ipairs与pairs详解
在说pairs与ipairs之前,先说Lua中table的数据结构:
1.由一个哈希表与一个数组构成,当插入一个元素时,如果元素是键值对,则将其放入哈希表中,如果是值则放入数组中。
2.hash表上会有冲突,通过一个链表的形式组织冲突的元素。
接下来看一下ipairs与pairs是如何遍历table的:
例:
数据在表 t 中的存储方式:
1)根据元素类别分别存进哈希表与数组:
哈希表:{ [1]=1,[3]=3,[5]=5,[6]=6 };
数组:{ 2,4 }
2)将数组中的元素放入哈希表:
当数组中的元素转移到哈希表时,数组中的元素变为[1]=2与[2]=4;而此时哈希表中已有键值对 [1]=1,发生冲突,会将新值2重新与键1匹配,即得到新的键值对[1]=2,此时的哈希表元素为:
{ [1]=2,[2]=4,[3]=3,[5]=5,[6]=6 }
所以当ipairs遍历table时,从键值1开始连续递增,当键值断开或遇到nil时退出,所以上面的例子中ipairs遍历出的结果是2,4,3。
而pairs遍历时,会遍历表中的所有键值对,且元素是根据哈希算法来排序的,得到的不一定是连续的,所以pairs遍历出的结果是2,4,3,6,5。
本文若有不正确之处,敬请提出,多多指教。