简介
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传递进来的参数的。