最近在看lua脚本相关的东西,总结一下基础的语法:
一:lua八种数据类型
a: 基础数据类型
1:nil: it usually represents the absence of a useful value 代表一个没有被使用的值
2:boolean true false
3: number: 整型或者浮点型 64位整型和64位float 当然32也是可选的一般用做小机和嵌入式系统
4:string,
b: 引用数据类型
5:function 函数类型
6:userdata :允许将任意的c数据类型存储到lua变量中,两种:full userdata(lua管理内存块的对象) light userdata 简单的c指针值 用户自定义数据
7:thread :实现协程,不跟操作系统类型相关,支持全平台
8:table: 表,最灵活最常用
查看数据的类型:type(变量名字)
a = "asdf"
print(type(a)) // string
二: 控制语句:if else , while循环,for循环,
a: if else 流程控制:
tag = false;
if tag then
print("real");
else
print("unreal");
end
score = 90;
if score > 10 then
print(" > 10");
if score > 50 then
print(" > 50");
if score > 80 then
print("优秀");
if score >= 90 then
print("学霸");
end
end
end
else
print(" < 10")
end
sex = 20;
if sex > 90 then
print("古稀");
elseif sex > 80 then
print("花甲");
elseif sex > 60 then
print("不惑");
elseif sex > 40 then
print("知天命");
else
print("我也不知道了");
end
age = 10;
age2 = 20;
if age ~= age2 then
print("age != age2");
end
if age >= 10 or age2 >= 20 then
print("age and age2 is test");
end
if age == 10 and age2 == 20 then
print("age == 10 and age2 == 20");
end
test = 1;
print("test is "..test);
b: while,for 循环
i = 0;
tag = true;
while tag do
if i > 100 then
tag = false;
break;
end
print(i);
-- mSleep(1000);
i = i + 1;
end
for t=1,10,1 do
print("t is ",t);
end
print("over");
c: for循环迭代
-- 数组下标也是从1开始的
arr = { 1, 2, 3, 3, 4, 4, 4 };
print(#arr);
-- print(arr[0]);
print(arr[1]);
-- 迭代器
for k, v in pairs(arr) do
print("kv is " .. k .. " -> " .. v);
end
if arr[1] < 10 then
print("arr[0] is " .. arr[1]);
end
d: 例程,读取文件:
local list = nil;
local path = "./files/test.plist";
local textArr = {};
-- local f = io.open(path);
local index = 1;
for line in io.lines(path) do
print('value is ' .. line);
list = { next = list, value = line };
textArr[index] = line;
index = index + 1;
end
-- while list do
-- print(list.value);
-- list = list.next;
-- end
for k, v in pairs(textArr) do
print(v);
end
三: lua 函数,一般可以将一个文件导出为一个table,在table里面加入函数定义,闭包函数类似于其他的语言(js,python)
tb = {};
local function _test()
local closeNum = 0;
-- 闭包函数
return function()
local res = closeNum + 1;
closeNum = res;
return res;
end
end
-- 可选参数
function tb.sum(...)
local sum = 0;
local args = { ... };
print(#args);
local closeFun = _test();
for k, v in pairs(args) do
print("v is " .. v);
local res = closeFun();
print("closet funtion exec res is " .. res);
sum = sum + v;
end
return sum;
end
tb.mul = function(...)
local args = { ... };
local res = 1;
for k, v in pairs(args) do
res = res * v;
end
return res;
end
return tb;
四: 数据类型 table
a: table数据的长度:#table
-- 表或者数组的下标从1开始
ta = {};
ta[1] = "asd";
ta[2] = 1;
print("表的长度:"..(#ta));
-- print("ta is "..ta);
-- .. 连接符连接两个变量输出
print("ta[0] is "..ta[1]);
print("ta[1] is "..ta[2]);
ta = nil;
五: 协程的使用:
协程c1和协程c2,先启动协程c1,在每一次for循环中去启动协程c2,两个配合给人以并行的错觉,c2的yield就是挂起了c2,然后程序记录最后一次执行c2的标记,下次进入c2协程,接着从c2记得标记开始执行,c1的话同理
-- lua 协程
-- 协程1
local function f1(...)
local ars = { ... }
print(ars);
local sum = 0;
for k, v in ipairs(ars) do
print("f1 v is " .. v);
local res, v1 = coroutine.resume(c2, 6, 7, 8, 9, 10)
print("f1 " .. v1);
sum = sum + v;
end
print("sum is " .. sum);
return sum;
end
c1 = coroutine.create(f1);
-- 协程2
local function f2(...)
local args = { ... };
for k, v in ipairs(args) do
print("f2 v is " .. v);
-- 挂起协程2
local v1 = coroutine.yield(v);
print("f2 " .. v1);
-- coroutine.resume(col1);
end
end
c2 = coroutine.create(f2);
coroutine.resume(c1, 1, 2, 3, 4, 5);