Lua笔记-关于lua table的C API

来源:互联网 发布:中国网络日报T大漠鱼T 编辑:程序博客网 时间:2024/05/19 02:23
  1. //Lua笔记-关于lua table的C API  
  2. //转载请注明来自yuliying的CSDN博客.  
  3. //Lua版本5.2  
  4.   
  5. /*相关API: 
  6. ====lua_createtable 
  7.     原型: void lua_createtable (lua_State *L, int narr, int nrec); 
  8.     描述: 创建一个新的table并将之放在栈顶.narr是该table数组部分的长度,nrec是该table hash部分的长度. 
  9.         当我们确切的知道要放多少元素到table的时候,使用这个函数,lua可以预分配一些内存,提升性能. 
  10.         如果不确定要存放多少元素可以使用 lua_newtable 函数来创建table. 
  11.          
  12. ====lua_newtable 
  13.     原型: void lua_newtable (lua_State *L); 
  14.     描述: 创建一个新的table并将之放在栈顶. 等同于lua_createtable(L, 0, 0).  
  15.      
  16. ====lua_getfield 
  17.     原型: void lua_getfield (lua_State *L, int index, const char *k); 
  18.     描述: 将t[k]元素push到栈顶. 其中t是index处的table. 
  19.         这个函数可能触发index元方法. 
  20.      
  21. ====lua_setfield 
  22.     原型: void lua_setfield (lua_State *L, int index, const char *k); 
  23.     描述: 为table中的key赋值. t[k] = v . 其中t是index处的table , v为栈顶元素. 
  24.         这个函数可能触发newindex元方法. 
  25.         调用完成后弹出栈顶元素(value).  
  26.  
  27. ====lua_gettable 
  28.     原型: void lua_gettable (lua_State *L, int index); 
  29.     描述: 将t[k]元素push到栈顶. 其中t是index处的table,k为栈顶元素. 
  30.         这个函数可能触发index元方法. 
  31.         调用完成后弹出栈顶元素(key). 
  32.          
  33. ====lua_settable 
  34.     原型: void lua_settable (lua_State *L, int index); 
  35.     描述: 为table中的key赋值. t[k] = v . 其中t是index处的table , v为栈顶元素. k为-2处的元素. 
  36.         这个函数可能触发newindex元方法. 
  37.         调用完成后弹出栈顶两个元素(key , value) 
  38.          
  39. ====lua_rawget 
  40.     原型: void lua_rawget (lua_State *L, int index); 
  41.     描述: 与lua_gettable函数类似, 但是不会触发index元方法. 
  42.      
  43. ====lua_rawset 
  44.     原型: void lua_rawset (lua_State *L, int index); 
  45.     描述: 与lua_settable函数类似, 但是不会触发newindex元方法. 
  46.      
  47. ====lua_rawgeti 
  48.     原型: void lua_rawgeti (lua_State *L, int index, int n); 
  49.     描述: 将t[n]元素push到栈顶.其中t是index处的table. 
  50.         这个函数不会触发index元方法. 
  51.      
  52. ====lua_rawseti 
  53.     原型: void lua_rawseti (lua_State *L, int index, int n); 
  54.     描述: 为table中的key赋值. t[n] = v .其中t是index处的table , v为栈顶元素. 
  55.         这个函数不会触发newindex元方法. 
  56.         调用完成后弹出栈顶元素. 
  57.      
  58. ====lua_rawgetp 
  59.     原型: void lua_rawgetp (lua_State *L, int index, const void *p); 
  60.     描述: 将t[p]元素push到栈顶.其中t是index处的table. p是一个lightuserdata. 
  61.         这个函数不会触发index元方法. 
  62.      
  63. ====lua_rawsetp 
  64.     原型: void lua_rawsetp (lua_State *L, int index, const void *p); 
  65.     描述: 为table中的key赋值. t[p] = v .其中t是index处的table , p是一个lightuserdata , v为栈顶元素. 
  66.         这个函数不会触发newindex元方法. 
  67.         调用完成后弹出栈顶元素. 
  68.      
  69. ====lua_getmetatable 
  70.     原型: int lua_getmetatable (lua_State *L, int index); 
  71.     描述: 将index处元素的元表push到栈顶. 如果该元素没有元表, 函数返回0 , 不改变栈. 
  72.      
  73. ====lua_setmetatable 
  74.     原型: void lua_setmetatable (lua_State *L, int index); 
  75.     描述: 将栈顶元素设置为index处元素的元表. 
  76.         调用完成后弹出栈顶元素. 
  77.      
  78. ====lua_istable 
  79.     原型: int lua_istable (lua_State *L, int index); 
  80.     描述: 判断index处元素是否为一个table , 如果是返回1,否则返回0. 
  81.      
  82. ====lua_pushglobaltable 
  83.     原型: void lua_pushglobaltable (lua_State *L); 
  84.     描述: 将lua的全局表放在栈顶. 
  85.  
  86. ====luaL_newmetatable 
  87.     原型: int luaL_newmetatable (lua_State *L, const char *tname); 
  88.     描述: 如果注册表中已经有名为tname的key,则返回0. 
  89.         否则创建一个新table作为userdata的元表. 这个元表存储在注册表中,并以tname为key. 返回1. 
  90.         函数完成后将该元表置于栈顶. 
  91.          
  92. ====luaL_getmetatable 
  93.     原型: void luaL_getmetatable (lua_State *L, const char *tname); 
  94.     描述: 将注册表中以tname为key的元表push到栈顶. 
  95.      
  96. ====luaL_setmetatable 
  97.     原型: void luaL_setmetatable (lua_State *L, const char *tname); 
  98.     描述: 将栈顶元素存储到注册表中, 它的key为tname. 
  99.      
  100. ====luaL_getsubtable 
  101.     原型: int luaL_getsubtable (lua_State *L, int idx, const char *fname); 
  102.     描述: 将 t[fname] push到栈顶, 其中t是index处的table , 并且 t[fname] 也为一个table. 
  103.         如果 t[fname] 原本就存在,返回 true ,否则返回false,并且将 t[fname] 新建为一张空表. 
  104.  
  105. ====lua_getglobal 
  106.     原型: void lua_getglobal (lua_State *L, const char *name); 
  107.     描述: 将 t[name] 元素push到栈顶, 其中t为全局表. 
  108.  
  109. ====lua_setglobal 
  110.     原型: void lua_setglobal (lua_State *L, const char *name); 
  111.     描述: 为table中的key赋值. t[name] = v . 其中t为全局表. v为栈顶元素. 
  112.         调用完成后弹出栈顶元素(v). 
  113.          
  114. ====luaL_newlibtable 
  115.     原型: void luaL_newlibtable (lua_State *L, const luaL_Reg l[]); 
  116.     描述: 创建一张空表, lua预先分配足够的内存用来存储我们创建的函数库. 
  117.         稍后我们可以使用 luaL_setfuncs 函数注册我们的函数库. 
  118.      
  119. ====luaL_setfuncs 
  120.     原型: void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup); 
  121.     描述: 将所有 luaL_Reg数组中的函数注册到栈顶的table中.  
  122.         当upvalue个数不为0时,所创建的所有函数共享这些upvalue. -2到-(nup+1)的元素为要注册的upvalue. 
  123.         (注意:这些upvalue是c中的upvalue,不是lua中的upvalue,可以在注册的c函数中通过 lua_upvalueindex(n)获取其值.) 
  124.         调用完成后弹出栈顶的所有upvalue. 
  125.      
  126. ====luaL_newlib 
  127.     原型: void luaL_newlib (lua_State *L, const luaL_Reg *l); 
  128.     描述: 创建一个新的table , 并将luaL_Reg数组中的函数注册到其中. 
  129.         它是一个宏 (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0)) 
  130.          
  131. ====lua_next 
  132.     原型: int lua_next (lua_State *L, int index); 
  133.     描述: 该函数用来遍历一个table. 
  134.         从栈顶弹出一个key , 并且push一个 key-value对(栈顶key的下一个键值对) ,到栈顶. 
  135.         如果table中没有更多的元素, 函数返回0. 
  136.         遍历开始时栈顶为一个nil , 函数取出第一个键值对. 
  137.          
  138.         通常遍历方法为: 
  139.         lua_pushnil(L);  // first key 
  140.         while (lua_next(L, t) != 0) { 
  141.             // uses 'key' (at index -2) and 'value' (at index -1) 
  142.             printf("%s - %s\n", 
  143.             lua_typename(L, lua_type(L, -2)), 
  144.             lua_typename(L, lua_type(L, -1))); 
  145.             // removes 'value'; keeps 'key' for next iteration  
  146.             lua_pop(L, 1); 
  147.         } 
  148.         注意: 在遍历table的时候 ,除非明确的知道key为字符串,不要对栈上的key使用 lua_tolstring 函数 , 
  149.         因为这样有可能改变key的类型 , 影响下一次 lua_next调用. 
  150.          
  151. ====lua_rawlen 
  152.     原型: size_t lua_rawlen (lua_State *L, int index); 
  153.     描述: 获取index处元素的长度. 
  154.         对于字符串来说,返回字符串长度. 
  155.         对于table来说,返回#操作符的长度. 不受元方法影响. 
  156.         对于userdata来说,返回内存的大小. 
  157.         其他元素返回0. 
  158.          
  159. ====lua_len 
  160.     原型: void lua_len (lua_State *L, int index); 
  161.     描述: 获取index处元素#操作符的结果 , 放置在栈顶. 
  162.      
  163. */  
  164.   
  165. /* 其他概念: 
  166.     1.伪索引: 
  167.         Lua栈的正常索引 从栈顶算,栈顶为-1,向栈低递减. 从栈低算,栈低为1,向栈顶递增. 
  168.         伪索引是一种索引,他不在栈的位置中,通过一个宏来定义伪索引的位置. 
  169.         伪索引被用来访问注册表,或者在lua_CFunction中访问upvalue. 
  170.  
  171.     2.注册表: 
  172.         Lua的注册表是一个预定义的table, 可以提供给c api存储一切想要存储的值. 
  173.         注册表通过 LUA_REGISTRYINDEX 伪索引来访问. 
  174.         例如 lua_getfield 函数可以像下面这样使用来获取注册表中的一个以"hello"为key的值 : 
  175.             lua_getfield( L , LUA_REGISTRYINDEX , "hello"); 
  176.          
  177.     3. upvalue: 
  178.         在使用 lua_pushcfunction 或者 luaL_setfuncs 将一个lua_CFunction 注册到Lua环境中时, 
  179.         可以同时为这个函数设置一些upvalue .  
  180.         而后在这些lua_CFunction 中可以使用 lua_upvalueindex(n) 函数来获取对应位置的upvalue. 
  181.          
  182. */ 
原创粉丝点击