LUA table

1 table实现介绍

脚本table中的元素在c中是分两个地方存放的,即数组与hash表。table中元素的位置也不是一直固定的,它会根据table被修改的情况动态改变。下面分两种情况说一下table的特点,我们首先要知道在lua中,索引值可以为负数也可以为正数,当为负数的话,top为-1,当为正数第一个压入栈的元素为1,依此类推,如果构造table的时候指定了key的值,不管key是何值,也会将key进行hash。比如

t1 =

{

[1] = 100,

[2] = 200,

[3] = 300,

}

只有构造table时不指定key值,这些value才会放在数组段。比如

t2 = {100, 200, 300}

2 表访问的一些规则

  • table支持几乎是所有类型的下标,包括函数
  • 对于字符串下标,我们可以省略方框和双引号,但是数字下标不可以
  • table默认的第一个索引下标是1,如果没有指定下表,就只能通过索引值来访问表的成员

3 table操作

//

//如果设置的k:v k是字符串,也可能是其它lua数值类型(比如常见的数字索引),可以使用lua_settable

//void (lua_settable) (lua_State *L, int idx);

//idx 指的是要操作的表在堆栈的位置

//key 和value在哪呢,在栈上面,一般情况下栈如下

// |value| stack top

// |key |

// |table| stack bottom

//

//lua_rawset用法同lua_settable,但更快(因为当key不存在时不用访问元方法__newindex)

//

//如果设置的k:v k是字符串,可以使用lua_setfield方便点

//LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k);

//idx 指的是要操作的表在堆栈的位置

//k表示要设置的key

//那value在哪呢?就是栈顶.

//