/*
1:Table按照Lua语言的定义,需要实现四种基本操作:读、写、迭代和获取长度。
2:Lua中并没有删除操作,而仅仅是把对应键位的值设置为nil 。
3:写操作被实现为查询已有键位,若不存在则创建新键。
得到键位后,写入操作就是一次赋值。
4:所以,在table模块中,实际实现的基本操作为:创建、查询、迭代和获取长度
*/
/*
1:创建操作的API为luaH_newkey,阅读它的实现就能对整个table有一个全面的认识。
2:它只负责在哈希表中创建出一个不存在的键,而不关数组部分的工作。
3:因为table的数组部分操作和C语言数组没有什么不同,不需要特别处理。
4:lua的哈希表以闭散列方式实现。每个可能的键值,在哈希表中都有一个主要位置,称作mainposition
5:创建一个新键时,检查mainposition,若无人使用,则可以直接设置为这个新键。
6:若之前有其它键占据了这个位置,则检查占据此位置的键的主位置是不是这里。
7:若两者位置冲突,则利用Node结构中的next域, 以一个单向链表的形式把它们链起来;
8:否则,新键占据这个位置,而老键更换到新位置并根据它的主键找到属于它的链的那条单向链表中上
一个结点,重新链入。
9:无论是哪种冲突情况,都需要在哈希表中找到一个空闲可用的结点。
这里是在getfreepos函数中,递减lastfree域来实现的.
10:Lua也不会在设置键位的值为nil时而回收空间,而是在预先准备好的哈希空间使用完后惰性回收;
即在getfreepos递减到哈希空间头时,做一次rehash操作
*/