LUA编程
文章平均质量分 73
ouyangshima
找到心中的那份自信
技术不牢,地动山摇
展开
-
[Lua]弱表Weak table
弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的。弱表的定义是:Aweak table is a table whose elements are weak references,元素为弱引用的表就叫弱表。有弱引用那么也就有强引用,有引用那么也就有非引用。我们先要厘这些基本概念:变量、值、类型、对象。(1)变量与值:Lua是一个dynamically type...原创 2014-10-20 20:04:37 · 7569 阅读 · 1 评论 -
[Lua]Lua序列化
持久化持久化(Persistence),即把内存中的对象保存到可永久保存的存储设备中。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。 持久化是将程序数据在持久状态和瞬时状态间转换的机制。(应用与游戏,) JDBC就是一种持久化机制。文件IO也是一种持久化机制。为什么需要持久化服务呢?那是由于内存本身的缺陷引起的:内存掉电后数据会丢失...原创 2014-09-26 19:06:18 · 5125 阅读 · 0 评论 -
[Lua]Lua的面向对象程序设计
Lua中的表不仅在某种意义上是一种对象。像对象一样,表也有状态(成员变量);也有与对象的值独立的本性,特别是拥有两个不同值的对象(table)代表两个不同的对象;一个对象在不同的时候也可以有不同的值,但他始终是一个对象;与对象类似,表的生命周期与其由什么创建、在哪创建没有关系。local Account = {balance = 0}function Account.withdraw(v)原创 2015-03-20 15:31:10 · 1488 阅读 · 2 评论 -
[Lua]表相关元方法
关于算术运算和关系元运算的metamethods都定义了错误状态的行为,他们并不改变语言本身的行为。针对在两种正常状态:表的不存在的域的查询和修改,Lua也提供了改变table的行为的方法。元方法是元表的方法。_index当我们访问一个表的不存在的域,返回结果为nil,这是正确的,但并不一定正确。实际上,这种访问触发lua解释器去查找__index metamethod:如果不存在,返回结...原创 2014-10-15 20:49:34 · 1465 阅读 · 1 评论 -
[Lua]概述
lua是什么Lua是一中嵌入式的脚本语言。Lua语言可以独立进行编程,但这不是其主要的使用方式。Lua虽然有动态、灵活的语法提供强大的功能,但并不像Java、Python等一样有一个完善的库(但仍存在一定数量的第三方库),这不是缺陷,而是和其定位有关。Lua最典型的用法,是作为一个库,嵌入到其他大型语言(称之为宿主语言)的应用程序之中,为应用程序提供参数配置或逻辑描述等功能,带...原创 2013-08-20 01:45:13 · 1881 阅读 · 0 评论 -
Lua元表与元方法
前言元表对应的英文是metatable,元方法是metamethod。我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算。在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了。Lua是怎么做的?通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串原创 2014-10-14 19:21:29 · 1970 阅读 · 0 评论 -
[Lua]Lua内存泄露检测原理
lua内存泄露首先第一点,lua中的内存泄露和我们所说的c/c++中的内存泄露本质上是不一样的。lua中有垃圾回收机制(GC),所以理论上是不会有内存泄露的。当它进行GC的时候,会从根部开始扫描所有的对象,如果某个地方对这个对象还有引用,就不会把这个对象内存collect,这个对象就没有被GC。所以lua中的内存泄露是指那些:已经没有被使用了,但外部依然还有引用存在的对象。--函数原创 2015-02-13 15:11:46 · 13518 阅读 · 0 评论 -
[Lua]Lua IO库整理
I/O库为文件操作提供了两种不同的模型,简单模型和完整模型。简单模型假设有一个当前输入文件和一个当前输出文件,它的I/O操作均作用于这些文件。完整模型则使用显式地文件句柄。它采用了面向对象的风格,并将所有的操作定义为文件句柄上的方法。 简单IO模式简单模型的所有操作都作用于两个当前文件。I/O库将当前输入文件初始化为进程标准输入(stdin),将当前输出文件初始化为进程标准输出。在执行io原创 2015-02-10 11:30:20 · 5013 阅读 · 0 评论 -
[Lua]字符串及字符串匹配
--lua中字符串索引从前往后是1,2,……,从后往前是-1,-2……。--string库中所有的function都不会直接操作字符串,只返回一个结果基本函数 函数 描述 示例 结果 len 计算字符串长度 string.len("abcd") ...原创 2014-11-18 20:07:52 · 19179 阅读 · 1 评论 -
Lua整理——table库
table属性table库是有一些辅助函数构成的,这些函数将table作为数组来操作。其中,有对列表中插入和删除元素的函数,有对数组元素进行排序的函数,还有对链接一个数组中所有字符串的函数。0.table.getn()Lua 中我们经常假定 array 在最后一个非 nil 元素处结束。这个传统的约定有一个弊端:我们的 array中不能拥有 nil 元素。对大部分应用来原创 2014-08-12 00:02:06 · 8053 阅读 · 0 评论 -
[Lua]数据结构
Lua中的table不是一种简单的数据结构,它可以作为其它数据结构的基础。如数组array、记录record、线性表list、队列queue和集合set等,在Lua中都可以通过table来表示。数组在lua中通过整数下标访问表中的元素即可简单的实现数组。并且数组不必事先指定大小,大小可以随需要动态的增长。a = {}for i = 1,100 do a[i] = 0end...原创 2014-12-28 13:40:34 · 2214 阅读 · 0 评论 -
[Lua]MAC上搭建lua开发环境
1、下载破解版的CodeRunner2、安装lua命令curl -R -O http://www.lua.org/ftp/lua-5.3.4.tar.gztar zxf lua-5.3.4.tar.gzcd lua-5.3.4make macosxsudo make installlua官网下载原创 2017-11-07 09:57:34 · 907 阅读 · 0 评论 -
[Lua]闭包
函数闭包function createCountdownTimer(second) local ms=second * 1000; local function countDown() ms = ms - 1; return ms; end return countDown;endtimer1 = createCountdownTimer(1);for原创 2014-05-01 15:16:14 · 3017 阅读 · 0 评论 -
[Lua]Lua那些积累
Lua垃圾回收算法?Lua的GC算法使用的所谓“Mark And Sweep”标记清除算法。简单的理解,这个算法将GC分为两个阶段,一个是标记(mark)阶段,这一阶段将所有系统中引用的对象都逐一标记;而在清理(sweep)阶段,将把在mark阶段中没有被标记的数据删除。 对于元表的理解?1.元表是一个表,它有一些元方法,如加减乘除、大于小于等于、__index,__newin...原创 2010-03-15 21:12:00 · 788 阅读 · 0 评论 -
[Lua]Lua中的小技巧
1.如果 x 为 false 或者 nil 则给 x 赋初始值 vx = x or v2.C语言中的三元运算符,a ? b : c在Lua中可以这样实现:(a and b) or c3.我们可以这样进行交换变量的值x, y = y, x -- swap 'x' for 'y'a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[i原创 2015-02-10 15:36:29 · 2334 阅读 · 0 评论 -
Lua开发工具
Lua开发工具(Lua Development Tools,LDT)一直以来是作为Eclipse的一个插件(Koneki)存在,现在LDT开发团队决定将其从Eclipse剥离,发展成为一个独立的开发环境。原创 2014-11-17 19:54:18 · 1595 阅读 · 0 评论 -
Lua基础(一)——赋值语句、表达式、流程控制、函数
赋值语句注释,用(--)来表示定义,lua中没有定义(申明数据类型),它是通过赋值来确定其数据类型的。赋值,是改变一个变量的值和改变表域的最基本的方法。 a = "hello" .. "world" Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。a, b = 10, 2*x a=10; b=2*x 遇到赋值语句原创 2014-04-30 18:14:55 · 7091 阅读 · 0 评论 -
Lua迭代器与泛型for
迭代器与闭包迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素。迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里。闭包提供的机制可以很容易实现这个任务。记住:闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量。每次闭包的成功调用后这些外部局部变量原创 2014-12-05 15:42:18 · 2753 阅读 · 0 评论 -
Lua-编译-运行-调试
虽然我们把Lua当作解释型语言,但是Lua会首先把代码预编译成中间码然后再执行(很多解释型语言都是这么做的)。在解释型语言中存在编译阶段听起来不合适,然而,解释型语言的特征不在于他们是否被编译,而是编译器是语言运行时的一部分,所以,执行编译产生的中间码速度会更快。dofiledofile实际上是一个辅助的函数。真正完成功能的函数是loadfile;另外loadfile不会抛出错误信息而原创 2014-12-23 01:24:05 · 3530 阅读 · 0 评论 -
[Lua基础]操作系统库——Date,Time,Clock
基本概念函数Date原创 2014-10-26 19:43:06 · 3773 阅读 · 0 评论 -
Lua基础(二)——表
表a = { }b = { x = 1, ["hello, "] = "world!" }a.astring = "ni, hao!"a[1] = 100a["a table"] = bfunction foo()endfunction bar()enda[foo] = bar--分别穷举表a和bfor k, v in pairs(a) doprint(k, "=>",原创 2014-05-01 12:49:38 · 1494 阅读 · 0 评论 -
[Lua基础]包package——模块开发
包是一种组织代码的方式。很多语言专门提供了某种机制组织全局变量的命名,比如Modula的modules,Java和Perl的packages,C++的namespaces。每一种机制对在package中声明的元素的可见性以及其他一些细节的使用都有不同的规则。但是他们都提供了一种避免不同库中命名冲突的问题的机制。每一个程序库创建自己的命名空间,在这个命名空间中定义的名字和其他命名空间中定义的名字互不原创 2014-11-21 18:49:00 · 8682 阅读 · 1 评论 -
Lua进阶(二)——函数环境、包
函数环境function foo() print(g or "No g defined!")endfoo()setfenv(foo, { g = 100, print = print }) --设置foo的环境为表{ g=100, ...}foo()print(g or "No g defined!")--No g defined!--100--No g defined!原创 2014-05-01 15:58:11 · 1545 阅读 · 0 评论 -
[Lua]在C函数中保存状态--注册表,环境表,upvalue
什么叫做在C函数中保存状态?比如你现在使用Lua调用了C函数Func1,但是Func1中有一些数据在调用完以后保存下来,供以后使用。而这些数据就是所谓的状态,也就是我们需要保存的东东。有人就会说了,Lua调用C时,把所有的需要保存的状态都返回到Lua中,当调用下一个函数时,将需要的状态当做参数再传进去,不错,是一个办法,但是很麻烦。方法一:注册表;方法二:环境;方法三:upvalue。注册表是原创 2015-03-16 18:31:26 · 3411 阅读 · 0 评论 -
[Lua]Lua调用C/C++函数/库(动态链接方式)
新建DLL空的win32工程,新建test.cpp文件,内容如下/*Lua调用C/C++函数/库(动态链接方式)*/#includeusing namespace std;#includestatic int math_abs(lua_State *L){ lua_pushnumber(L, abs((int)luaL_checknumber(L, 1))); r原创 2015-03-14 18:20:47 · 4743 阅读 · 0 评论 -
[Lua]LuaAPI整理
LUA和C/C++的沟通桥梁——栈Lua生来就是为了和C交互的,因此使用C扩展Lua或者将Lua嵌入到C当中都是非常流行的做法。要想理解C和Lua的交互方式,首先要回顾一下C语言是如何处理函数参数的。C函数和参数大家知道C语言是用汇编实现的,在汇编语言中可没有函数的概念,与函数对应的是叫做子过程的东西,子过程就是一段指令,一个子过程与它调用的子过程之间通过栈来进行参数的传递交互。在一个原创 2015-01-31 11:00:55 · 6609 阅读 · 0 评论 -
[Lua]C/C++调用Lua
lua脚本文件--cCallLuaTest.lua--read variablevar_int = 5 var_str = "hello,lua!!!"var_bool = truevar_table_color = {r=12,g=34,b=56}--call functionvar_fun1 = function(a,b) print("hello,world!!原创 2015-03-11 18:53:41 · 877 阅读 · 0 评论 -
[Lua]Lua调用C/C++函数/库(函数压栈方式)
test.cpp文件/*C/C++调用Lua*/#includeusing namespace std;#include/*当我们需要在Lua里面调用C/C++函数时,所有的函数都必须满足以下函数签名:typedef int (*lua_CFunction) (lua_State *L);换句话说,所有的函数必须接收一个lua_State作为参数,同时返回一个整数值。因为这个函数原创 2015-03-14 17:32:16 · 1788 阅读 · 0 评论 -
通过Lua彻底明白了回调函数
Lua回调函数实例local m = {}local list = {name="hello",age=12}m.call_back_fun_print = function(printID) print(printID .. "-->" .. list[printID])endm.add_list = function(key,value,call_back_fun)原创 2014-12-02 17:07:35 · 17361 阅读 · 0 评论 -
[Lua]协调coroutine
协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈,局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。++线程与协同程序的主要区别在于++,一个具有多线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行。就是说,一个具有多个协同程序的程序在***任何时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显示地挂起时,它的执行才会暂停***。一、lua协程函...原创 2019-06-19 22:53:19 · 543 阅读 · 0 评论