![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Lua学习
以例子为主,逐步了解Lua语言的使用
sinat_27016095
这个作者很懒,什么都没留下…
展开
-
Lua协程的使用
Lua由于其语言设计的原因,并不支持多线程。但是我们可以使用协程的api来进行线程的切换,从而达到多线程的目的。我们常用的api有:coroutine.create() 创建一个协程coroutine.resume() 使协程继续运行coroutine.yield() 将协程挂起我们使用以下这个例子来说明协程的运作模式local function play(a) print(a) local ret = coroutine.yield(666) print('play原创 2020-08-09 21:58:47 · 1185 阅读 · 0 评论 -
Lua string正则表达式
Lua正则表达式我们都用过string.find这个函数来查找字符串中指定串的位置。那如果我们想从’192.168.0.1’这个串中找到’.'的位置就会写出如下代码:local s,e = string.find('192.168.0.1','.')print(s,e)但是,当你运行时,就会发现如下输出:1 1我明明查的是’.'的位置,为什么会给我字符串开头呢?我们查找了Lua的API声明看到如下描述:string.find(s, pattern, init, plain) Looks原创 2020-08-16 20:27:43 · 686 阅读 · 0 评论 -
Lua自定义userdata(与C++对象绑定)
userdata是lua提供给开发者自定义C/C++数据结构的一套api,他能够在C/C++层映射内存空间,使我们的程序能够更加的灵活。下面我就来介绍一下userdata是如何绑定C/C++对象的。首先定义构造函数如下#define HTTP_REQUEST_META_NAME "HttpRequest"class HttpRequestWrapper {public: HttpRequestWrapper(const char*bind,const char*host, int port原创 2020-08-02 21:39:04 · 459 阅读 · 0 评论 -
C/C++如何给Lua定义全局table
给Lua定义一个context tablelua_newtable(L);for (int i = 0; i < 3; i++) { lua_pushinteger(L, i +1);//set key lua_pushinteger(L, i);//set value lua_settable(L, -3); //push key,value}lua_settable(L, -3); //push key,valuelua_setglobal(L, "context");在lua原创 2020-07-12 20:36:37 · 448 阅读 · 0 评论 -
Lua自定义C/C++库函数
首先给库中定义一个函数static int sys_tick(lua_State *L) { long long time = system_tick(); lua_pushinteger(L, time); return 1;}之后将函数与lua中用的函数名称关联起来static const struct luaL_Reg system_lib_f[] = { { "tick", sys_tick}, { NULL,NULL } };最后将函数和库的名称注册到lua中就行了#de原创 2020-07-26 21:26:30 · 337 阅读 · 0 评论 -
Lua自定义C/C++函数
地方各个地方原创 2020-06-26 21:05:41 · 347 阅读 · 0 评论 -
Lua 5.4 close的使用
Lua 5.4中新增加了close功能,下面来详细介绍一下:被标记为to-be-closed的局部变量,会在超出它的作用域时,调用它的__closed元方法,这就为我们提供了类似C++析构函数的作用。所以一个被标记为to-be-closed的变量应该符合两个前提条件:1、它是一个table2、已经为它指定了__close元方法举个例子:local t = {}setmetatable(t, {__close=function() print('close') end})local fu原创 2020-08-30 20:50:07 · 2598 阅读 · 0 评论 -
Lua 使用面向对象编程
在lua原生语法特性中是不具备面向对象设计的特性。因此,要想在lua上像其他高级语言一样使用面向对象的设计方法,我们可以使用元表(metatable)来模拟面向对象设计。首先写一个构造函数:local People = { height = 0,age = 0}function People:new() local o = {} setmetatable(o,self) self.__index = self return oend可以看到我们构造了一个People的类,原创 2020-09-06 23:12:01 · 175 阅读 · 0 评论 -
Lua 如何重载运算符
我们都知道在C++中,可以通过重载运算符来实现代码的简练。在lua中我们也可以实现类似的操作。先举个例子:local cood = {}function cood:new(x,y) local o = {} setmetatable(o,self) o.x = x o.y = y return oendcood.__add=function (a,b) local x = a.x+b.x local y = a.y+b.y return cood:new(x,y)原创 2020-08-23 18:43:28 · 1760 阅读 · 0 评论 -
C/C++如何给快速调用Lua中定义的函数
要想在C中调用Lua中的函数,按照之前方法,需要先找到函数所在的位置。于是我们需要调用 lua_getglobal这个函数,而实际上lua_getglobal这个函数又是如何找到name所在的位置呢?我们先看这个函数的实现LUA_API int lua_getglobal (lua_State *L, const char *name) { Table *reg = hvalue(&G(L)->l_registry); lua_lock(L); return auxgetst原创 2020-07-19 21:15:05 · 291 阅读 · 0 评论 -
C/C++如何调用Lua定义的全局函数
C/C++如何调用Lua定义的全局函数首先找到Lua中的对应函数如下lua_getglobal(L, "startSearch"); // 获取函数,压入栈中lua_pushinteger(L, (long) 267000000); // 压入第一个参数lua_pushinteger(L, (long) 111000000); // 压入第二个参数之后调用这个函数int iRet = lua_pcall(L, 2, 1, 0); // 调用函数,调用完成以后,会将返回值压入栈中,2表示参数个数原创 2020-07-05 19:57:29 · 454 阅读 · 0 评论