Lua api(十) lua_pushboolean/lua_push*

前两章我们总结了lua_is*系列和lua_to*系列,掌握了lua栈内值的判断和转换方法,现在我们来看看lua_push*系列,这些api的作用是将相应类型的值压入栈内,说实话这一组api有好多我也没有使用过,但是为了知识的完整性,在这里只是简单的列举在这里,然后一起学习一下。

通过上一章所说的lua_is*系列,我们已经可以判定数值的类型,但是这不是我们的最终目的,我们的最终目的是使用这些值,检测类型只是来判断的,而这些存在栈中的值究竟要怎样用,就要涉及到今天我所列举的这些api,也就是使用频率相当高的lua_to*系列。

  • 原型:void lua_pushboolean (lua_State *L, int b);
  • 解释:把 b 作为一个 boolean 值压入堆栈。
  • 原型:int lua_toboolean (lua_State *L, int index)
  • 解释:把指定的索引处的的 Lua 值转换为一个 C 中的 boolean 值。 和 Lua
    中做的所有测试一样, lua_toboolean 会把任何 不同于 false 和 nil
    的值当作 1 返回; 否则就返回 0 。 如果用一个无效索引去调用也会返回 0

  • 原型:void lua_pushcclosure (lua_State *L, lua_CFunction fn, int
    n);
  • 解释:把一个新的 C closure 压入堆栈。
  • 原型:lua_CFunction lua_tocfunction (lua_State *L, int index);
  • 解释:把给定索引处的 Lua 值转换为一个 C 函数。 这个值必须是一个 C
    函数;如果不是就返回 NULL 。

  • 原型:void lua_pushcfunction (lua_State *L, lua_CFunction f);
  • 解释:将一个 C 函数压入堆栈。 这个函数接收一个 C
    函数指针,并将一个类型为 function 的 Lua 值
    压入堆栈。当这个栈顶的值被调用时,将触发对应的 C 函数。
  • 原型:lua_Integer lua_tointeger (lua_State *L, int idx);
  • 解释: 把给定索引处的 Lua 值转换为 lua_Integer
    这样一个有符号整数类型。 这个 Lua
    值必须是一个数字或是一个可以转换为数字的字符串, 否则 lua_tointeger
    返回 0 。

  • 原型:const char *lua_pushfstring (lua_State *L, const char
    *fmt, …);
  • 解释:把一个格式化过的字符串压入堆栈,然后返回这个字符串的指针。
    它和 C 函数 sprintf 比较像,不过有一点区别如下:

    • 你需要为结果分配空间: 其结果是一个 Lua 字符串,由 Lua
      来关心其内存分配 (同时通过垃圾收集来释放内存)。
    • 这个格式化转换非常的受限。 不支持 flag 、宽度、或是指定精度。
      它只支持下面这些: ‘%%’ , ‘%s’
      (插入一个带零终止符的字符串,没有长度限制), ‘%f’ (插入一个
      lua_Number), ‘%p’ (插入一个指针或是一个十六进制数), ‘%d’
      , ‘%c’ (把一个 int 作为一个字符插入)。
  • 原型:const char *lua_tolstring (lua_State *L, int index,
    size_t *len);
  • 解释:把给定索引处的 Lua 值转换为一个 C 字符串。 如果 len 不为 NULL
    , 它还把字符串长度设到 *len 中。 这个 Lua
    值必须是一个字符串或是一个数字; 否则返回返回 NULL 。
    如果值是一个数字,lua_tolstring
    还会把堆栈中的那个值的实际类型转换为一个字符串。

  • 原型:void lua_pushinteger (lua_State *L, lua_Integer n);
  • 解释:把 n 作为一个数字压栈。
  • 原型:lua_Number lua_tonumber (lua_State *L, int index);
  • 解释:把给定索引处的 Lua 值转换为 lua_Number 这样一个 C 类型。 这个
    Lua 值必须是一个数字或是一个可转换为数字的字符串,
    否则,lua_tonumber 返回 0 。

  • 原型:void lua_pushlightuserdata (lua_State *L, void *p);
  • 解释:把一个 light userdata 压栈。 userdata 在 Lua 中表示一个 C
    值。light userdata
    表示一个指针。它是一个像数字一样的值:你不需要专门创建它,它也没有独立的
    metatable ,而且也不会被收集(因为从来不需要创建)。只要表示的 C
    地址相同,两个 light userdata 就相等。
  • 原型:const void *lua_topointer (lua_State *L, int index);
  • 解释: 把给定索引处的值转换为一般的 C 指针 。 这个值可以是一个
    userdata ,table ,thread 或是一个 function ; 否则,lua_topointer
    返回 NULL 。 不同的对象有不同的指针。
    不存在把指针再转回原有类型的方法。

  • 原型:void lua_pushlstring (lua_State *L, const char *s, size_t
    len);
  • 解释:把指针 s 指向的长度为 len 的字符串压栈。Lua
    对这个字符串做一次内存拷贝,因此 s
    处的内存在函数返回后,可以释放掉或是重用于其它用途,字符串内可以保存有零字符。
  • 原型:const char *lua_tostring (lua_State *L, int index);
  • 解释:等价于 lua_tolstring ,而参数 len 设为 NULL 。

  • 原型:void lua_pushnil (lua_State *L);
  • 解释:把一个 nil 压栈。
  • 原型:lua_State *lua_tothread (lua_State *L, int index);
  • 解释:把给定索引处的值转换为一个 Lua 线程(由 lua_State* 代表)。
    这个值必须是一个线程;否则函数返回 NULL 。

  • 原型:void lua_pushnumber (lua_State *L, lua_Number n);
  • 解释:把一个数字 n 压栈。
  • 原型:void *lua_touserdata (lua_State *L, int index);
  • 解释:如果给定索引处的值是一个完整的 userdata
    ,函数返回内存块的地址。 如果值是一个 light userdata
    ,那么就返回它表示的指针。 否则返回 NULL 。

发表评论

电子邮件地址不会被公开。 必填项已用*标注