Lua api(十) lua_pushboolean/lua_push*

前言#

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

内容#


lua_pushboolean##

  • 原型:void lua_pushboolean (lua_State *L, int b);
  • 解释:把 b 作为一个 boolean 值压入堆栈。

lua_pushcclosure##

  • 原型:void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);
  • 解释:把一个新的 C closure 压入堆栈。

lua_pushcfunction##

  • 原型:void lua_pushcfunction (lua_State *L, lua_CFunction f);
  • 解释:将一个 C 函数压入堆栈。 这个函数接收一个 C 函数指针,并将一个类型为 function 的 Lua 值 压入堆栈。当这个栈顶的值被调用时,将触发对应的 C 函数。

lua_pushfstring##

  • 原型:const char *lua_pushfstring (lua_State *L, const char *fmt, ...);
  • 解释:把一个格式化过的字符串压入堆栈,然后返回这个字符串的指针。 它和 C 函数 sprintf 比较像,不过有一点区别如下:
    • 你需要为结果分配空间: 其结果是一个 Lua 字符串,由 Lua 来关心其内存分配 (同时通过垃圾收集来释放内存)。
    • 这个格式化转换非常的受限。 不支持 flag 、宽度、或是指定精度。 它只支持下面这些: '%%' (插入一个 '%'), '%s' (插入一个带零终止符的字符串,没有长度限制), '%f' (插入一个 lua_Number), '%p' (插入一个指针或是一个十六进制数), '%d' (插入一个 int), '%c' (把一个 int 作为一个字符插入)。

lua_pushinteger##

  • 原型:void lua_pushinteger (lua_State *L, lua_Integer n);
  • 解释:把 n 作为一个数字压栈。

lua_pushlightuserdata##

  • 原型:void lua_pushlightuserdata (lua_State *L, void *p);
  • 解释:把一个 light userdata 压栈。 userdata 在 Lua 中表示一个 C 值。light userdata 表示一个指针。它是一个像数字一样的值:你不需要专门创建它,它也没有独立的 metatable ,而且也不会被收集(因为从来不需要创建)。只要表示的 C 地址相同,两个 light userdata 就相等。

lua_pushlstring##

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

lua_pushnil##

  • 原型:void lua_pushnil (lua_State *L);
  • 解释:把一个 nil 压栈。

lua_pushnumber##

  • 原型:void lua_pushnumber (lua_State *L, lua_Number n);
  • 解释:把一个数字 n 压栈。

lua_pushstring##

  • 原型:void lua_pushstring (lua_State *L, const char *s);
  • 解释:把指针 s 指向的以零结尾的字符串压栈。Lua 对这个字符串做一次内存拷贝(或是复用一个拷贝),因此 s 处的内存在函数返回后,可以释放掉或是重用于其它用途。字符串中不能包含有零字符,第一个碰到的零字符会认为是字符串的结束。

lua_pushthread##

  • 原型:int lua_pushthread (lua_State *L);
  • 解释:把 L 中提供的线程压栈。 如果这个线程是当前状态机的主线程的话返回 1 。

lua_pushvalue##

  • 原型:void lua_pushvalue (lua_State *L, int index);
  • 解释:把堆栈上给定有效处索引处的元素作一个拷贝压栈。

lua_pushvfstring##

  • 原型:const char *lua_pushvfstring (lua_State *L, const char *fmt, va_list argp);
  • 解释:等价于 lua_pushfstring, 不过是用 va_list 接收参数,而不是用可变数量的实际参数。

Usage##

  • 首先我们来新建一个文件,将文件命名为pushtest.lua然后编写如下代码:
-- 定义一个table
information = 
{
    name = "tom",
    age = 28,
    sex = "man",
    married = true;
}

function func_print_data()
    print("lua -- > information.name = "..information.name)
    print("lua -- > information.age  = "..information.age)
    print("lua -- > information.sex  = "..information.sex)

    if information.married then
        print("lua -- > "..information.name.." is married")
    else
        print("lua -- > "..information.name.." is not married")
    end
end
  • 接下来们来编写c++调用代码:
    lua_State *L = lua_open();
    luaL_openlibs(L);

    luaL_dofile(L,"pushtest.lua");          // 加载执行lua文件
    lua_getglobal(L,"information");         // 将全局表压入栈

    lua_pushstring(L, "name");              // 将要修改的变量名压入栈
    lua_pushstring(L, "AlbertS");           // -->lua_pushstring用法
    lua_rawset(L, -3);

    lua_pushstring(L, "age");
    lua_pushinteger(L, 20);                 // -->lua_pushinteger用法
    lua_rawset(L, -3);

    lua_pushstring(L, "married");
    lua_pushboolean(L, false);              // -->lua_pushboolean用法
    lua_rawset(L, -3);


    lua_getglobal(L, "func_print_data");    // 函数入栈
    lua_pcall(L, 0, 0, 0);                  // 打印信息

    lua_close(L);                           // 关闭lua环境  
  • 结果
pushdata.png

总结#

  • 这一章的代码中api的使用较少,原因是有一些api我也没用过,在这里只起到抛砖引玉的作用,希望大家可以掌握api使用的思路。
  • lua_pushcfunction 是作为一个宏定义出现的,只是 lua_pushcclosure(L,f,0) 的简便写法。
  • lua api总结到现在已经有十章了,相信日常工作中所涉及的大部分、高频率使用的api都已经在这十章之中讲过了,其实这就是一个相互学习的过程,我总结了一遍也从中发现了一些之前没有遇到过的问题,也给大家找到了学习的例子。
  • 另外大家熟悉了这些api以后可以练习一下,每一章我都给出了代码和运行结果,大家可以试试读代码,写结果,看看结果是不是和自己想的一样。
  • 好了,lua api系列暂时就写到这里,今后有需要我会继续补充,如果有什么地方写的不正确,欢迎大家批评指正。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 第一篇 语言 第0章 序言 Lua仅让你用少量的代码解决关键问题。 Lua所提供的机制是C不擅长的:高级语言,动态...
    testfor阅读 2,642评论 1 7
  • 当在Lua和C之间交换数据时主要的问题是自动回收与手动回收内存管理的不一致。因此,Lua 用一个抽象的栈在Lua与...
    luffier阅读 2,628评论 0 3
  • C API 云风Blog:Lua C API 的正确用法 C读取和调用Lua文件的库:lua.h, lauxlib...
    SysuYe阅读 5,629评论 2 10
  • 前言# 通过上一章所说的lua_is*系列,我们已经可以判定数值的类型,但是这不是我们的最终目的,我们的最终目的是...
    AlbertS阅读 8,616评论 0 5
  • Swift swift 3.0中废弃了dispatch_once,这里只记录一个标准的单例写法,具体相关的内容,可...
    流火绯瞳阅读 7,709评论 0 6