原文连接:https://blog.csdn.net/u012787710/article/details/52495011。

userdata (Lua5.3)

Q:什么是 userdata ?
A:分为两类,full userdata 和 light userdata。Lua使用他们来表示C中的类型。

Q:两种”userdata”的区别?
A:

例子一 light userdata


#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
typedef struct
{int x;int y;int z;
}TData;static int getAttribute(lua_State* L)
{TData *data = (TData*)lua_touserdata(L, 1);std::string attribute = luaL_checkstring(L, 2);int result = 0;if (attribute == "x"){result = data->x;}else if (attribute == "y"){result = data->y;}else{result = data->z;}lua_pushnumber(L, result);return 1;
}static  luaL_Reg dataLib[] = {{ "__index", getAttribute },{ NULL, NULL }
};void getMetaTable(lua_State* L, luaL_Reg* methods)
{lua_pushlightuserdata(L, methods);lua_gettable(L, LUA_REGISTRYINDEX);if (lua_isnil(L, -1)) {/* not found */lua_pop(L, 1);lua_newtable(L);luaL_setfuncs(L, methods, 0);lua_pushlightuserdata(L, methods);lua_pushvalue(L, -2);lua_settable(L, LUA_REGISTRYINDEX);}
}int main()
{const char* filename = "test.lua";lua_State *lua = luaL_newstate();if (lua == NULL){fprintf(stderr, "open lua failed");return -1;}luaL_openlibs(lua);TData input = { 123, 231, 321 };lua_pushlightuserdata(lua, &input);getMetaTable(lua, dataLib);lua_setmetatable(lua, -2);lua_setglobal(lua, "input");if (luaL_dofile(lua, filename)){//luaL_error(lua, "load file %s failed", filename);}lua_getglobal(lua, "data");int output = lua_tointeger(lua, -1);std::cout << output << std::endl;return 0;
}

lua文件

data = input.x;
print(data)

例子二 full userdata

//#include <string.h>  extern "C" {#include "lua.h"  #include "lauxlib.h"  #include "lualib.h"
}#include <iostream>
using namespace std;static struct StudentTag
{char *strName; // 学生姓名char *strNum; // 学号int iSex; // 学生性别int iAge; // 学生年龄
}T;static int Student(lua_State *L)
{size_t iBytes = sizeof(struct StudentTag);struct StudentTag *pStudent;pStudent = (struct StudentTag *)lua_newuserdata(L, iBytes);//设置元表luaL_getmetatable(L, "Student");lua_setmetatable(L, -2);//lua_pushnumber(L, 123);return 1; // 新的userdata已经在栈上了
}static int GetName(lua_State *L)
{struct StudentTag *pStudent = (struct StudentTag *)luaL_checkudata(L, 1, "Student");lua_pushstring(L, pStudent->strName);return 1;
}static int SetName(lua_State *L)
{// 第一个参数是userdatastruct StudentTag *pStudent = (struct StudentTag *)luaL_checkudata(L, 1, "Student");// 第二个参数是一个字符串const char *pName = luaL_checkstring(L, 2);luaL_argcheck(L, pName != NULL && pName != "", 2, "Wrong Parameter");pStudent->strName =(char*) pName;return 0;
}static int GetAge(lua_State *L)
{struct StudentTag *pStudent = (struct StudentTag *)luaL_checkudata(L, 1, "Student");lua_pushinteger(L, pStudent->iAge);return 1;
}static int SetAge(lua_State *L)
{struct StudentTag *pStudent = (struct StudentTag *)luaL_checkudata(L, 1, "Student");int iAge = luaL_checkinteger(L, 2);luaL_argcheck(L, iAge >= 6 && iAge <= 100, 2, "Wrong Parameter");pStudent->iAge = iAge;return 0;
}static int GetSex(lua_State *L)
{// 这里由你来补充return 1;
}static int SetSex(lua_State *L)
{// 这里由你来补充return 0;
}static int GetNum(lua_State *L)
{// 这里由你来补充return 1;
}static int SetNum(lua_State *L)
{// 这里由你来补充return 0;
}static  luaL_Reg arrayFunc_meta[] =
{{ "getName", GetName },{ "setName", SetName },{ "getAge", GetAge },{ "setAge", SetAge },{ "getSex", GetSex },{ "setSex", SetSex },{ "getNum", GetNum },{ "setNum", SetNum },{ NULL, NULL }
};static luaL_Reg arrayFunc[] =
{{ "new", Student},{ NULL, NULL }
};extern "C"  _declspec(dllexport) int luaopen_mytestlib(lua_State *L)
{// 创建一个新的元表luaL_newmetatable(L, "Student");// 元表.__index = 元表lua_pushvalue(L, -1);lua_setfield(L, -2, "__index");luaL_setfuncs(L, arrayFunc_meta, 0);luaL_newlib(L, arrayFunc);lua_pushvalue(L, -1);lua_setglobal(L, "Sdudent"); /* the module name */return 1;
}

lua文件

require "mytestlib"local objStudent = Sdudent.new()objStudent:setName("果冻")
local strName = objStudent:getName()
print(strName )for k,v in pairs(getmetatable(objStudent)) doprint(tostring(k),tostring(v))
end

参考

http://blog.csdn.net/mydriverc2/article/details/51007803
http://blog.csdn.net/rain_qingtian/article/details/44781183


原文链接:https://blog.csdn.net/fwb330198372/article/details/82217022

userdata和lightuserdata
可以让C返回一个句柄给Lua,而Lua可以将句柄再通过在C中注册的方法传回C

userdata:
userdata通过Lua的API(lua_newuserdata())分配内存,就像C里的malloc()函数分配内存,
但不需要调用free()去释放内存,该内存是由LUA的GC机制进行回收。

lightuserdata:
lightuserdata通过LUA的API(lua_pushlightuserdata())创建,返回一个指针。
当你需要把这个一个C的对象传到LUA里,并且需要自己管理这个指针时,lightuserdata就很适用了。
但是,这个C对象是需要自己管理,LUA并不会帮忙回收。
例如Cocos2d-x拥有自己的GC机制,使用lightuserdata把数据对象的指针传到LUA里。

区别:
1.userdata是由LUA的GC机制进行回收
2.lightuserdata需要自己管理分配和回收。


Lua中的userdata连接(Lua5.3):https://blog.csdn.net/qq826364410/article/details/88672091

userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 、指针和类)存储到 Lua 变量中调用。


lua的userdata解析 (Lua 5.1)

在我发表《Lua中的类型与值》这篇文章时,就有读者给我留言了,说:你应该好好总结一下Lua中的function和userdata类型。现在是时候总结了。对于function,我在《Lua中的函数》这篇文章中进行了总结,而这篇文章将会对Lua中的userdata进行仔细的总结。

Lua userdata详解相关推荐

  1. 合宙lua库详解-socket

    文章目录 简介 START 建立连接 发送数据 接收数据 关闭连接 主动关闭 被动关闭 简介 作为通讯的基础,只要你上网就需要用到lua的socket模块,即使使用mqtt,http等其它模块间接也调 ...

  2. 合宙lua库详解-sys

    文章目录 简介 QUESTION START sys.init(0,0) sys.run lua内部消息机制 publish subscribe waitUntil dispatch 定时器的实现 * ...

  3. Nginx模块Lua-Nginx-Module学习笔记(二)Lua指令详解(Directives)

    源码地址:https://github.com/Tinywan/Lua-Nginx-Redis Nginx与Lua编写脚本的基本构建块是指令. 指令用于指定何时运行用户Lua代码以及如何使用结果. 下 ...

  4. 合宙lua库详解-ril

    简介 肝了这么久的讲解,一个评论和点赞都没有,没有一丝丝反馈,没有一丝丝赞扬.难受哦!!! 但是我还得肝,必须肝出一个赞. 如果大家能给点反馈,给点一键三连,我肝的更起劲.大家的评价是我前进最大的鼓舞 ...

  5. Lua语法详解之多态

    --面向对象实现 --万物之父 所有对象的基类 object Object={} --实例化方法 function Object:new()local obj={}--给空对象设置元表,以及__ind ...

  6. ulua中lua代码使用反射调用c#详解

    1.官方解释 2.代码层分析 2.1 官方脚本 2.2 语句 luanet.load_assembly('UnityEngine')解析 LuaState lua = new LuaState(); ...

  7. Cocos 2d-X Lua 游戏添加苹果内购(二) OC和Lua交互代码详解

    这是第二篇 Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程 这是前面的第一篇,详细的说明了怎样添加内购项目以及填写银行信息提交以及沙盒测试员的添加使用以及需要我们注意的东西,结 ...

  8. Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程

    事前准备 最近给游戏添加了苹果的内购,这一块的东西也是刚刚做完,总结一下,其实这里不管是游戏还是我们普通的App添加内购这一块的东西都是差不多的,多出来的部分就是我们Lua和OC的交互的部分,以前刚开 ...

  9. 详解C调用lua脚本效率测试

    详解C调用lua脚本效率测试 C调用lua脚本效率测试是本文要介绍的内容,以下代码以C语言为基准,测试了C调用Lua循环和循环调用Lua的效率.结论是不要频繁地穿越C/Lua边界. #include  ...

最新文章

  1. XML与Webservices相关的安全问题概述
  2. 性能测试(04)-表达式和业务关联-JDBC关联
  3. boa + ajax + cgi ajax请求cgi
  4. (转)Python 面向对象编程(一)
  5. 网宿科技:向云服务商转型
  6. 打开qq农场外挂显示无法与服务器同步,稍后再试是怎么回事啊,qq农场为什么打不开...
  7. 单片机IO详解(上拉 下拉 准双向 输入 输出 推挽 开漏)
  8. 程序员年龄变大后的职业出路是什么?
  9. 计算机换色带技巧,打印机色带维护技巧
  10. 哈尔滨工业大学计算机考研难吗,哈尔滨工业大学计算机考研经验:只有意志坚强才能到达彼岸...
  11. python课程结课感悟_关于python课程的感想
  12. 计算机课程word教学,浅谈计算机Word表格的制作课程教学
  13. Axure 元件属性
  14. matlab入门精讲 【官方资料精简而来,确保全面】
  15. RabbitMQ消息队列,发送消息失败、消息持久化、消费者失败处理方法和发送消息
  16. dd指令打包iso文件 linux_Linux_如何在Linux操作系统下创建ISO镜像文件,1、用dd命令#dd if=/dev/cdrom - phpStudy...
  17. CodeForces - 1244E
  18. python vlookup_多条件python中的Vlookup
  19. 【PMP认证考试之个人总结】第 7 章 项目质量管理
  20. 参加csdn活动有感

热门文章

  1. vs code创建项目教程
  2. Shapefile资源下载网址(整理自用)
  3. Java学习-20211213
  4. [FEEDSKY]我谈中文网志年会
  5. 什么叫给密码“加盐”?如何安全的为你的用户密码“加盐”?
  6. 机械师F-117 Ubuntu 安装显卡驱动以及CUDA
  7. mysql - 表字段值自增(auto_increment)
  8. *leetcode-313-超级丑数-medium
  9. pythonocc进阶学习:分割面/合并面(体)splitter/glue
  10. 利用Album 实现仿微信图片选择(加入了图片剪裁)