初识 Lua

从入门到入坑

Posted by SWZ on May 15, 2020

简介

Lua 是一门小而精的嵌入式语言,它可以很方便的和C代码交互,是一门非常好的开源语言。目前常被用于游戏、Web开发、人工智能等众多领域。Lua还具备非常良好的可扩展简明高效可移植的特性。

表(Table)是Lua语言中最重要(事实上也是唯一的)和强大的数据结构。使用表,Lua可以以一种简单、统一且高效的方式表示数组、集合和其他很多数据结构。

闭包

Lua语言中的函数是第一类值,这就意味着函数和其他常见类型的值(例如数值和字符串)具有同等的权限。


元表 & 元方法

  • __index 元方法

    这是 metatable 最常用的键。

    当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。

  • __newindex 元方法

    __newindex 元方法用来对表更新,__index则用来对表访问 。

    当你给表的一个缺少的索引赋值,解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作。


面向对象

Account = { balance = 0 }
function Account:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    return o
end
SpecialAccount = Account:new({topLimit = 1000})

S = SpecialAccount:new()

垃圾回收

Lua语言使用自动内存管理,通过垃圾收集(garbage collection)自动地删除成为垃圾的对象。弱引用表(week table)、析构器(finalizer)和函数collectgarbage是在Lua语言中用来辅助垃圾收集器的主要机制。


协同程序

function foo (a)
    print("foo 函数输出", a)
    return coroutine.yield(2 * a) -- 返回  2*a 的值
end
 
co = coroutine.create(function (a , b)
    print("第一次协同程序执行输出", a, b) -- co-body 1 10
    local r = foo(a + 1)
     
    print("第二次协同程序执行输出", r)
    local r, s = coroutine.yield(a + b, a - b)  -- a,b的值为第一次调用协同程序时传入
     
    print("第三次协同程序执行输出", r, s)
    return b, "结束协同程序"                   -- b的值为第二次调用协同程序时传入
end)
       
print("main", coroutine.resume(co, 1, 10)) -- true, 4
print("--分割线----")
print("main", coroutine.resume(co, "r")) -- true 11 -9
print("---分割线---")
print("main", coroutine.resume(co, "x", "y")) -- true 10 end
print("---分割线---")
print("main", coroutin
第一次协同程序执行输出    1    10
foo 函数输出    2
main    true    4
--分割线----
第二次协同程序执行输出    r
main    true    11    -9
---分割线---
第三次协同程序执行输出    x    y
main    true    10    结束协同程序
---分割线---
main    false    cannot resume dead coroutine
---分割线---

coroutine有三种状态:dead、suspending、running

注意:1. yield( xx )内部的对象就是resume的返回值,例如:yield(2*a),其中2*a就是开启该协程的resume函数的返回值。2. yield的返回值用于接收下一次的参数,例如:local r就是接收下一次resume传递进来的参数的。