lua简介:
**lua的目标:**其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua 应用场景:
print("Hello World!")
print "HelloWorld"
lua语法格式没有高级语言这么严格,好比说每句代码末尾的分号可加可不加
lua中不需要用类型来声明对象
脚本式编程:
我们可以将 Lua 程序代码保持到一个以 lua 结尾的文件,并执行,该模式称为脚本式编程
注释:
--当行注释
--[[
多行注释
]]--
**标识符:**规则和c#的差不多
全局变量:
在默认情况下,变量总是认为是全局的。全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil
a = 10
print(a)
print(b)
--如果你想删除一个全局变量,只需要将变量赋值为nil
a = nil
print(a)
Lua中有8中数据类型,分别是:nil、boolean、number、string、function、userdata(用户自定义类型)、thread、table。
测试:
print(type(nil)) --nil
print(type(true)) --boolean
print(type("cch")) --string
print(type(3.3)) --number
print(type({})) --table
print(type(print)) --function
遍历一个table:
tab1 = {name = "cch",age = 22}
print(tab1.name)
for key,value in pairs(tab1) do
print(key..":"..value)
end
nil在条件判断中代表false:
b = nil
if(b) then
print(true)
else
print(false)
end
变量:
赋值语句:
a,b,c = 10,4,5
print(a)
print(b)
print(c
索引:
对 table 的索引使用方括号 []。Lua 也提供了 . 操作。
tab1 = {name = "cch",age = 22}
print(tab1["name"]) --cch
print(tab1.name) --cch
Lua中提供了三种循环方式:while、for、repeat…until
while:
while(condition)
do
statements
end
while循环测试:
a = 20
while(a > 0) do
print(a)
a = a - 1
end
for:
for var=exp1,exp2,exp3 do
<执行体>
end
var从exp1变化到exp2,每次变化以exp3为步长递增var,并执行一次"执行体"。exp3是可选的,如果不指定,默认为1。
for循环测试:
for i = 10,1,-1 do
print(i)
end
repeat…until:
repeat
statements
until( condition )
当until后面的条件语句为true时停止执行循环体,次循环的循环体至少执行一次
repeat…until循环测试:
a = 10
repeat
print(a)
a = a - 1
until(a <= 0)
循环嵌套(打印九九乘法表):
for i = 1,9,1 do
local str = "";
for j = 1,i,1 do
str = str .."\t".. j.."*"..i.."="..(i*j)
end
print(str)
end
Lua中只提供了if…else的流程控制语句,没有c#中的switch语句
if(条件)
then
代码块
end
函数的定义:
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end
解析:
实例:
function Max(num1,num2)
local maxNum
if(num1 > num2) then
maxNum = num1
else
maxNum = num2
end
return maxNum
end
print(Max(2,3))
函数多返回值:
Lua函数可以返回多个结果值,比如string.find,其返回匹配串"开始和结束的下标"(如果不存在匹配串返回nil)。
function MaxAndMin(...)
local tab = {...}
local max = tab[1]
local min = tab[1]
for key,value in pairs(tab) do
if(value > max) then
max = value;
end
if(value < min) then
min = value;
end
end
return min,max
end
print(MaxAndMin(0,8,2,3,45)) --0 45
print(string.find("cchcch",'cch')) -- 1 3
可变参数
Lua 函数可以接受可变数目的参数,类似于c#中的params,在函数参数列表中使用三点 … 表示函数有可变的参数。
function Add(...)
local tab = {...}
local sum = 0
for key,value in pairs(tab) do
sum = sum + value;
end
return sum,#tab
end
print(Add(12,13,56)) --81 3
实例:Lua实现快速排序
function QuickSortUnit(tab,left,right)
local temp = tab[left]
while(left < right) do
while(left < right and temp < tab[right]) do
right = right - 1;
end
tab[left] = tab[right]
while(left < right and temp >= tab[left]) do
left = left + 1
end
tab[right] = tab[left]
end
tab[left] = temp
return left
end
function QuickSort(tab,left,right)
local index = QuickSortUnit(tab,left,right)
if(left < right) then
QuickSort(tab,left,index-1)
QuickSort(tab,index+1,right)
end
end
tab1 = {45,32,23,16,9}
QuickSort(tab1,1,#tab1)
for key,value in pairs(tab1) do
print(value)
end
运算符是一个特殊的符号,用于告诉解释器执行特定的数学或逻辑运算。Lua提供了以下几种运算符类型:
常用的一些函数:
测试:
print(string.upper("cch")) --CCH
print(string.lower("CcH")) --cch
print(string.gsub("cchcch",'cc','bb',2)) --bbhbbh
print(string.find("cchcch","cch")) --1 3
print(string.reverse("cchcch")) --hcchcc
print(string.format("this string is %s","cch")) --this string is cch
print(string.char(67,68)) --CD
print(string.byte("CDAD",3)) --65(A)
print(string.len("cch")) --3
print(string.rep("cch",3)) --cchcchcch
for word in string.gmatch("Hello Lua user", "%a+") do
print(word)
end --Hello Lua user
print(string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)"))) --2, "questions"
Lua中的数组与c#不同,Lua中的数组下标从1开始,其他方面差不多
tab = {23,3,4,5,56,67}
for i=1,#tab do
print(tab[i])
i = i+1
end
迭代器:
tab = {23,3,4,5,56,67}
for k,v in pairs(tab) do
print(v)
end
table表的介绍:
测试:
-- table.concat(tab) 表连接 返回连接后的字符串
tab = {3,4,5,6,7,8}
print(table.concat(tab)) --345678
print(table.concat(tab,",")) --3,4,5,6,7,8
print(table.concat(tab," ",1,3)) --3 4 5
tab1 = {3,4,5,6,7}
table.insert(tab1,5,100);
for key,value in pairs(tab1) do
print(key..":"..value)
end
--1:3
--2:4
--3:5
--4:6
--5:100
--6:7
--tab = {3,4,5,6,7,8}
table.remove(tab); --默认删除最后一个
table.remove(tab,4);
for key,value in pairs(tab) do
print(key..":"..value)
end
-- table.sort(tab) 排序
tab = {3,4,5,6,7,8}
--table.sort(tab) --升序
table.sort(tab,function(a,b) return (a>b) end) --降序
for key,value in pairs(tab) do
print(value)
end
自定义迭代器:
tab2 = {1,2,3,4}
function fun(tab,index)
index = index+1
local value = tab[index]
if(value) then
return index,value
end
end
function selfpairs(tab)
return fun,tab,0
end
for key,value in selfpairs(tab2) do
print(key,value)
end
coroutine.create(方法) coroutine.resume(方法,参数)
创建协程,和唤醒协程,两个方法搭配起来使用
co = coroutine.create(
function(i)
print(i)
end
)
coroutine.resume(co,1) --1
coroutine.wrap(方法)
返回一个函数,一旦调用这个函数,就进入协程
co = coroutine.wrap(
function()
print("协程")
end
)
co() --协程
coroutine.status(co)
获取协程的状态(三种状态:suspended挂起 dead死亡 running运行中)
co = coroutine.create(
function(i)
print(i)
end
)
print(coroutine.status(co)) --suspended
coroutine.resume(co,1) --1
print(coroutine.status(co)) --dead
coroutine.yield(参数)
挂起协程,和resume()搭配只用,两个函数(或者说协程内部和外部)之间进行调用
resume和yield的配合强大之处在于,resume处于主程中,它将外部状态(数据)传入到协同程序内部;而yield则将内部的状态(数据)返回到主程中。
co = coroutine.create(
function(i)
num1,num2 = coroutine.yield(89)
print(i,num1,num2) -- 1 2
end
)
print(coroutine.status(co)) --suspended
print(coroutine.resume(co,1)) --true 89
coroutine.resume(co,2,3)
print(coroutine.status(co)) --dead