全局变量与局部变量
- local 局部 其他都为全局
注释
- 单行注释 –
- 多行注释 --[[ ]]
lua中的数据类型
- nil Lua中的特殊的类型
- 一个全局变量没有被复制以前默认值为nil
- 给全局变量赋值nil可以删除该变量
- boolen
- number
- string
- function
类型判断函数
- type()
函数
参数的默认值
function funA(a,b)
a = a or 1
b = b or 200
print (a)
print (b)
end
不定参数
function func( ... )
for i=1,select('#', ...) do
local argc = select(i, ...)
print("argc:" .. argc)
end
end
func(1,2,3,4,5,6)
select('#', ...)--长度
select(i, ...)--select返回它的第n个可变参数
运算符
- 三目运算符: and or = ? :
- 连接运算: …
- 长度运算符:#
赋值语句
多值赋值
- a,b = 10,2*x <–> a = 10;b = 2 * x
- 多余的会被忽略 少的会补足nil
交换赋值
x,y = y,x – swap’x’ for ‘y’
函数多返回值
- a,b = f()
- f()返回两个值,第一个赋给a,第二个赋给b
代码块
do
end
分支循环
if then
elseif then
else
end
while a<b do
print(a)
end 循环
lua 中没有 ++
repeat
print(a)
a = a+1
until a>b 条件为真 跳出循环与do while 正好相反
for i =1 ,10 ,2 do
end
输出
1 3 5 7 9
for i =1 ,fun() ,2 do
end
fun()调用一次
lua 没有continue 只有break
用嵌套循环来替代continue
repeat
if i == 3 then
break
end
until true
4种遍历
nil也可以打印
for i = 1, len do
end
只输出数组
for k,v in ipairs(a) do
end
可以输出所有键值
for k,v in next ,a do
end
for k,v in pair(a)do
end
### 插入
table.insert(index,a)
table.insert(a)
table.remove(index)
table.remove(a)
##加载和编译运行
dofile()--装载并执行
loadfile()--装载并编译为中间码,不执行
assert() 返回更清楚的错误信息
assert(loadfile()) 如果装载失败会抛出
f = loadstring("字符串") 加载不执行
f()执行
f = loadstring("fun a() return a end ")
可以动态从服务器获取字符串 来执行
require()
随机数
- my =os.time()系统时间
- math.randomseed(mytime)随机种子
- math.random(1,10)
抛出错误
fun do
- error()
end
s,err = pcall(foo,“rr”) 返回值给err s true or false
协程和线程的区别
线程和协程都是任意时刻只能运行一个
但是一个协程在运行的时候,其他协程是无法获得执行机会的。只有正在运行的协同程序主动挂起时,其他协同程序才有机会执行
线程呢 即使不主动休眠,也很有可能因为轮片时间到达而把执行机会让给其他线程
function coroutinFun()
local co = coroutine.create(function(a,b)
for i = 1,10 do
print(a+b)
coroutine.yield()
end
end)
return co
end
local co = coroutinFun()
coroutine.resume(co,5,5)
coroutine.resume(co,6,6)
print(coroutine.status(co))
闭包
- 闭包是函数中的函数,可以包含父函数的局部变量的代码块:可以让这些局部变量的值始终保持在内存中
- 它的最大作用处有2个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中
function funC()
local ii = 1
function ff()
ii = ii+1
print(ii)
end
return ff
end