Lua 編程:
程序控制語句:
條件控制 : if 條件 then ... elseif 條件 then .... else ... end
while 循環: while 條件 do ... end
Repeat 循環: repeat .....until 條件
For 循環: for 变量=初始值,终止值 ,步进 do ...end
For 循环:
语句块:
用do 和 end 括起来的
do print("hello") end
变量赋值:
默认情况下 变量总是认为是全局的,如果你要定义局部变量 要在定义变量的时候 用Local 修饰
可以多赋值 a, b , c= 1 ,2 ,3
数值运算符:
基本的数据操作: + ,- ,* ,/
还包括 ^ 表示指数的乘法运算 例如 2^3 结果为8
字符串连接 “ .. ”运算符
比较运算符:
<,>, <=, >=, ==, ~=
分别表示 小于,大于,不大于,不小于,相等,不相等
逻辑运算符:
and, or, not 这里需要注意的是只有false和nil 才能计算为false ,其它任何数据都计算为true ,0也是true
和C不一样的地方, and 和 or 的运算结果不是true和false 而是和它的两个操作手机相关:
a and b 如果a 为false 则返回 a 否则返回b
a or b 如果a 为true 则返回a 否则返回b
变量类型:
Nil 空值 所有没有使用过的变量都是Nil nil 即是值也是类型
Boolean 布尔值
Number 数值 相当于C语言中double
String 字符串
Table 关系表类型
Function 函数类型 函数也是一种类型,也就是说 所有函数 它本身就是一个变量
Userdata 这个类型专门用来和Lua宿主打交道,Userdata 可以是宿主的任意数据类型 通常是Struct 和指针
Thread 线程类型
变量的定义:
...
Table: 关系表类型 。我们可以把这个类型看作一个数组。在这个数组中你可以使用除nil 之外的所有数据类型作为索引
定义: T1={} -- 定义一个空表
T1[1]=10 --在表T1中插入一个值
T1["John"]={Age=27,Gender="Male"}
--这句相当于 T1["John"]={}
T1["John"]["Age"]=27
T1["John"]["Gender"]="Male"
当表的索引是字符串的时候 可以简写成:
T1.John={}
T1.John.Age=27
T1.John.Gender="Male" 或者 T1.John{Age=27,Gender="Male"}
Table 关系表中可以存放任何数据类型 包括函数
例如: T={
age=10,
add=function(self,t) self.age=self.age+t end
}
两种调用方式:
t.add(t,10)
t:add(10)
注意: Lua中只有一种基本的数据结果 就是table 其他的数据结构都由table 组成
Function
函数的定义:
function add(a,b)
return a+b
end
这句话相当于 add = function(a,b) return a+b end
此外 还可以给add 赋值(任何数据类型) 赋值之后add就不在表示上面个这个函数
函数参数:
Lua 的函数参数可以接受可变的参数个数,它同样用"..."来定义
例如:function sum(a,b,...)
在函数体内可以通过arg(局部变量, 表类型)来访问"..."代表的参数
例如: sum(1,2,3,4) 在函数中,a = 1, b = 2, arg = {3, 4}
函数返回值:
Objec[] objs= function s() return 1,2,3,4 end
注意: Lua中只有一种基本的数据结果 就是table 其他的数据结构都由table 组成
Lua 迭代器:
迭代器 iterator 是一种对象,能够遍历标准模板库容器的部分或全部元素,每一个迭代器对象代表容器种的确定的地址在Lua中的确定的地址,在Lua中迭代器是一种支持指针类型的结构,他可以遍历集合的每一个元素。
Lua 默认提供的迭代函数 ipairs。
array={"Lua","Tutorial"}
for key,value in ipairs(array)
do
print(key,value)
end
以上代码执行输出结果为:
1 Lua
2 Tutorial
Lua 模块和包
定义:
Lua的模块是由变量,函数等元素组成的table 因此创建一个模块很简单 就是创建table,然后把需要的常量,函数放入其中,最后返回这个table 。
module={} --定义一个module 模块
module.constant="这是一个常量" --定义一个常量
function module.func1() -- 定义一个函数
io.write("这是一个公有函数!\n")
end
local function func2() --定义一个私有函数
print("这是一个私有函数")
end
function func3() --调用 公有函数调用私有函数
func2()
end
require 函数:
Lua提供了一个名为require的函数用来加载模块。
require("<模块名>") 或者 require"<模块名>"
元表(Metatable)
作用:对两个table 进行操作,因为Lua提供了元表(Metatable) 运行我们改变table的行为,每一个行为都关联了对应的元方法。
定义元表的两个重要的方法:
setmetatable(table,metatable):对指定table设置元表(metatable),如果元表(metatable)中存在__metatable键值,setmetatable会失败 。
getmetatable(table):返回对象的元表(metatable)。
Lua 协同程序(coroutine)
什么是协同:
Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针 同时又与其他的协同程序共享全局变量和其他大部分东西。
线程和协同程序的区别:
线程与协同程序的主要区别在于,一个具有多线程的程序可以同时运行几个线程,而协同程序却需要彼此协作运行,在任意一个时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确被挂起的时候才能被挂起。
几个重要的函数:
coroutine.creat() -- 创建新的
coroutine.resume() -- 调用resume,将协同程序唤醒,resume操作成功返回true,否则返回false;
coroutine.yield() -- 线程
coroutine.warp() --
coroutine.running()
coroutine.status