lua 基础语法数据结构

最近在看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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值