Lua 笔记

闭包

基本用法

-- 闭包例子。内部函数引用了父级的变量 a 所以它不会被释放。
function closureFunction(a)
    local a = a or 0 -- 内部变量
    -- 将内部函数作为返回值
    return function ()
        a = a + 1 -- 此作用区域内无变量 a 调用的父级作用域
        print(a)
    end
end

-- 创建个变量用来放这个闭包
local f1 = closureFunction();

-- 调用 n 次。
for i=0,10 do
    f1();
end

静态变量

-- 闭包实现静态变量
function staic(v)
    local t = {} 
    t.staic_ = v or 0 -- 内部变量,默认值为0

    function t.set (v)
        t.staic_ = v
    end

    function t.get (v)
        return t.staic_
    end

    return  t
end

local staicv = staic()
print(staicv.get())
staicv.set(9)
print(staicv.get())

随机数

-- 随机播种子  os.time() 感觉也不太好用。时间太近就坑
-- 所以 reverse() 翻转过来,但其实也就将就
math.randomseed(tostring(os.time()):reverse():sub(1, 8))
-- 生成 0 到 2 的随机数
print(math.random(0, 2))

字符串

-- 格式化字符串 %02d 表示数字占位符,不足两位时高位补零。
-- 输出 cloud_02.png
print(string.format("cloud_%02d.png", 2))

遍历删除表项

-- 删表时从后往前删,不然删了前面的后面索引会变动。
local array = {1, 2, 3, 4, 5, 6, 7, 8, 9 }
for index = #array, 1, -1 do
    print("array:",array[#array])
    table.remove(array, index)
end

表长度 取值

-- 表的取值方式,表长度,索引最大值
POETRY_DATA = {
    李白 = {
    "花间一壶酒,独酌无相亲","举杯邀明月,对影成三人","我歌月徘徊,我舞影零乱",[9] = "hehe"
    }
}
-- .李白 与 ["李白"] 含义相同
print(POETRY_DATA.李白[1]) -- 按 Key李白  取值方式1
print(POETRY_DATA["李白"][1]) -- 按 Key李白  取值方式2
print(POETRY_DATA.李白[9]) -- 按索引取值方式

print(table.getn(POETRY_DATA.李白)) -- 表长度 3   getn(tableName) 等同于操作符 # 
print(#POETRY_DATA.李白) -- 表长度  3

print(table.maxn(POETRY_DATA.李白)) --索引最大值  9

排序

--  键值对是无序的
tbl = {a = "1", b = "2", c="3", d="4"};
table.sort(tbl)  
table.foreach(tbl, function(i, v) print (i, " : ",v)end) ; -- a:1  c:3  b:2  b:2
--  纯数字排序, 默认升序
tbl = {1, 2, 3, 5, 4}
table.sort(tbl)
print("数字升序: ", table.concat(tbl, ", "))

--  纯字符排序 , 默认升序。 按 ascii 码顺序
tbl = {"a", "B", "c", "d", "f", "e"}
table.sort(tbl)  
print("字符升序: ",table.concat(tbl, ", "))


-- 下面实现降序,自己先来定义个降序函数
-- 降序函数
function sortDescending(a, b)
    return a > b
end

tbl = {"a", "B", "c", "d", "f", "e"}
table.sort(tbl, sortDescending) -- 使用降序
print("字符降序: ",table.concat(tbl, ", "))

tbl = {1, 2, 3, 5, 4}
table.sort(tbl, sortDescending) -- 使用降序
print("数字降序: ", table.concat(tbl, ", "))

--[[
  数字字符混合排序,默认不支持,必须提供 sort 的第二个参数:一个排序函数
string.byte(a) 返回的是字符编码:本例中为 ASCII
这里直接传入一个匿名函数,玩家也可以根据自己的需要设定更复杂的排序条件。比如背包中装备排序按 1星级降序、2品质降序、3强化降序 进行排列
--]]
tbl = {1, "a", "B", "c", 2, 3, 5, "d", "f", "e", 4}
table.sort(tbl,function(a, b) return string.byte(a) < string.byte(b) end)
print("数字字符混合 升序:",table.concat(tbl, ", ")) 

遍历表

-- 切记别把 nil 留在表里,那会造成未知的结果。除非那就是你想要的

-- ipairs 遍历数组,索引 从1到nil 如果第一个就是nil 那就直接over了
tbl = { 6, 2 ,1, nil, 5, 3, 4, nil}  --  数组带 nil
table.sort(tbl) -- 在有 nil 的地方就断掉了,输出 1,2,6
print("数组中有 nil 的情况: ") -- table.concat(tbl, ", "))会丢弃键值对部分
for k, v in ipairs(tbl) do
 print(k," : ",v)
end

-- pairs 遍历 tabel 元素
tbl = {a = "xx", 1, 2, b="yy" ,3, nil, 5, 4}
--table.sort(tbl)
print("数组与列表混用情况: ") -- table.concat(tbl, ", "))会丢弃键值对部分
for k, v in pairs(tbl) do  -- pairs 以遍历键值对
 print(k," : ",v)
end

-- foreachi 遍历数组
tbl = {2, 4, 6, language="Lua",nil, version="5", 8, 10, 12, web="hello lua"};
print("foreachi 遍历数组: ")
table.foreachi(tbl, function(i, v) print (i, " : ", v)end) ;

-- foreach 遍历 table
tbl = {2, 4, 6, language="Lua",nil,  version="5", 8, 10, 12, web="hello lua"};
print("foreach 遍历 table: ")
table.foreach(tbl, function(i, v) print (i, " : ",v)end) ;

协程

-- 协程例子 :从哪跳出,下次就从哪开始。就算协程里调用了别的函数,在被调用的函数里有 coroutine.yield() 也一样,反正就是从哪暂停就从哪开始。暂停时传出来了参数,再开始可以传参数。
co = coroutine.create(function (a,b,c)
    print(a, b, c) -- 这里输出的是 resume 传进来的参数
    a, b, c = 1, 2, 3 -- 这里改变了 a, b, c 的值,下面 yield 跳出时返回的将是这些值
    local s1, s2, s3 = coroutine.yield(a, b, c) -- 第一次从这跳出:返回值就是括号里的,可以返回多个值
    print("a , b , c :  ",a , b , c)
    print("s1, s2, s3 :  ",s1, s2, s3) -- 这是第二波开始时传进来的参数
    return "  协程结束"
 end)

print("第一波结果:  ", coroutine.resume(co, "   第一波_参数1", "   第一波_参数2", "   第一波_参数3" ))
print("第二波结果:  ", coroutine.resume(co, "第二波:  ", "第二波_参数1","第二波_参数2","第二波_参数3")) -- 多余的参数,直接被抛弃。
print("第三波结果:  ", coroutine.resume(co, "第三波")) -- 这时 协程已经结束了。所以返回 false

其它

print("看下自己坑爹的 Lua 版本是多少 :",_G._VERSION)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑虾

多情黯叹痴情癫。情癫苦笑多情难

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值