lua其设计目的是为了嵌入到应用程序中,从而为应用程序提供灵活的扩展和定制供能
应用场景:游戏开发、web应用脚本、数据库插件、安全系统,如入侵检测系统
下载LuaDist开发工具
1.Lua基本语法
(1)单行注释 --
多行注释
--[[
注释
--]]
(2)全局变量
变量默认是全局的,全局变量不需要声明,给一个变量赋值后即创建了这个全局变量
,访问一个没有初始化的全局变量不会出错,得到的结果为nil
如果你想删除一个全局变量,只需要将变量赋值为nil
2.Lua数据类型
变量不要定义类型,只需要为变量赋值
Lua的8个基本类型:nil、boolean、number、string、userdata、function、thread、table
用type函数判定函数测试给定的变量或者值的类型
nil作比较时应该加上双引号:type(x)==”nil”
在对数字字符串进行算术运算时,lua会将其转换为数字
字符串连接使用:
print(“a” .. “b”) ab
Print(12 .. 34) 1234
(1)用#计算字符串的长度print(#“www”) 3
(2)初始化表(table):local tbl1 ={1,2,3,4,5}
lua的table(表)其实是一个关联数组,数组的索引可以是数字或者字符串
在lua里表的默认初始索引一般以1开始
3.lua变量
Lua中的变量全部是全局变量、哪怕是语句块或是函数里(a = 5)
用local显示声明的变量为局部变量,局部变量的作用域为从声明位置开始到所在语句块结束。(local b = 5)
变量的默认值均为nil
应该尽可能地使用局部变量,有两个好处:
(1)避免命名冲突
(2)访问局部变量的速度比全局变量更块
4.lua赋值
多值赋值经常用来交换变量,或将函数调用返回给变量
a,b = f() 将函数的返回值赋给a,b
5.lua循环
循环控制语句:
break:跳出循环
goto:将程序的控制点转移到一个标签处
(1)while循环
a=10
while(a < 20)
do
print(“a的值为:”,10)
a = a+1
end
(2)for循环
for var=exp1,exp2,exp3 do
<执行体>
end
var从exp1变化到exp2,每次变化以exp3为步长递增var,并执行一次执行体。exp3是可选的,默认为1
注意:for的三个表达式在循环开始前一次性求值,以后不在进行求值。比如上面的f(x)只会在循环开始前执行一次,其结果用在后面的循环中。
function f(x)
print(“function”)
return x*2
end
for i=1,f(5) do
print(i)
end
可以看到函数f(x)只在循环开始前执行一次
(3)泛型for循环
类似java中的foreach语句
nums = {1,2,3,4,5}
for i,v in ipairs(nums) do
print(v)
end
其中i时数组索引值,v是索引对应的数组元素值。Ipairs是Lua提供的一个迭代器函数,用来迭代数组
6.Lua流程控制
Lua中false和nil为假,其他都为真(包括0)
if(a < 20)
then
print(“a小于20”)
else
Print(“a大于20”)
end
7.Lua函数
function max(num1,num2)
if(num1 > num2)
then
result = num1;
else
result = num2;
end
return result;
end
(1)函数多返回值
s,e = string.find(“denglf”, “lf”)
print(s,e) 5 6
(2)可变参数
Lua在函数参数列表中用...表示函数有可变的参数
function average(...)
result = 0
local arg={...}
for i,v in ipairs(arg) do
result = result + v
end
print(“总共传入”..#arg.. “个数”)
return result/#arg
end
print(“平均值为”,average(10,5,3,3))
也可以通过select(“#”,...)来获取可变参数的数量。
8.Lua运算符
(1)关系运算符
~=不等于
(2)逻辑运算符
a为true,b为false
and:与。若a为false,则返回a,否则返回b
or:或。若a为true,则返回a,否则返回b
not:非。
(3)其他运算符
... 连接两个字符串
# 返回字符串的长度
9.Lua字符串
字符串可以用””或’’或[[]]来表示
操作字符串
(1)string.upper(argument) 转大写
(2)string.lower(argument) 转小写
(3)string.gsub(mainString,findSring,replaceSrting,num) 字符串替换
(4)string.find(str,substr,[init,[end]]) 返回匹配字符串的起始索引和结束索引
(5)string.reverse(arg)
(6)string.format(“the value is:%d”,3) 格式化字符串
(7)string.char(arg) char将整型数字转成字符并连接
(8)string.byte(arg) byte将字符转为整数值
(9)string.len(arg) 计算字符串长度
(10)string.rep(arg,n)返回字符串的n个拷贝
(11)...连接两个字符串
(12)Todo
(13)
10.Lua数组
Lua数组索引从1开始
(1)多维数组
11.Lua迭代器
Lua默认提供的迭代函数ipairs
array = {“dd”,”ff”}
for key, value in ipairs(array)
do
print(key,value)
end
12.Lua的table表
构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西
最简单的构造函数是{},用来创建一个空表。可以直接初始化数组。
Table操作:
(1)table连接:table.concat()
(2)插入:table.insert()
(3)移出:table.remove()
(4)排序:table.sort()
13.模块与包:
(1)模块类似于一个API,可以供别人调用,有利于代码重用
Lua模块是由变量、函数等已知元素组成的table,创建一个模块就是创建一个table,然后把需要导出常量、函数放入其中,最后返回table就行。
(2)require函数
require函数用来加载模块:require(“模块名”)
然后就可以调用模块里面的变量和方法
14.Lua原表
Lua提供了原表Metatable来对表之间进行操作
TODO
15.Lua协同
协同coroutine与线程类似:拥有独立的堆栈、独立的局部变量、独立的指令指针,同时又与其他协同程序共享全局变量和其他大部分东西
协同程序需要彼此协作运行
在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。
基本语法:
(1)coroutine.create():创建协同,当和resume配合使用的时候就唤醒函数
(2)coroutine.resume()重启协同,和create配合使用
(3)coroutine.yield()挂起协同,
(4)coroutine.status()查看协同状态(三种状态:dead、suspended、running)
(5)coroutine.wrap()创建协同,和create功能重复
(6)coroutine.running()返回一个正在跑的coroutine。
生产者消费者问题:
TODO
16.Lua文件I/O
用于读取和处理文件,分为简单模式和完全模式
(1)file = io.open(“test.lua”,”r”) 以只读方式打开文件
TODO
17.Lua错误处理
nil值不能参与运算
TODO
18.LuaDebug调试
debug.traceback()
debug.getinfo()
19.Lua垃圾回收
垃圾回收函数
(1)collectgarbage(“collect”):做一次完整的垃圾收集循环
(2)collectgarbage(“count”):以k字节数为单位返回Lua使用的总内存数
(3)collectgarbage(“restart”):重启垃圾回收器的自动运行
(4)Collectgarbage(“stop”):停止垃圾收集器的运行
20.Lua面向对象
对象由属性和方法组成。Lua种最基本的结构是table,所以需要table来描述对象的属性
Lua中的function可以用来表示方法,所以Lua中的类可以通过table+function模拟
TODO
21.Lua数据库连接
todo