lua要点
数据类型
八种基本类型:
数值(number):内部以double表示
字符串(string):总是以零结尾,但可以包含任意字符(包括零),因此并不等价于C字符串,而是其超集。
布尔(boolean):只有“true”或者“false”两个值。
函数(function):Lua的关键概念之一。不简单等同于C的函数或函数指针。
表(table):异构的Hash表。Lua的关键概念之一。
userdata :用户(非脚本用户)定义的C数据结构。脚本用户只能使用它,不能定义
nil :代表什么也没有,可以与C的NULL作类比,但它不是空指针
function foo(a, b, c)
local sum = a + b
return sum, c --函数可以返回多个值
end
r1, r2 =foo(1, '123', 'hello') --平行赋值
print(r1, r2)
输出结果:
124 hello
用关键字local定义。如果没有用local定义,即使在函数内部定义的变量也
是全局变量!
表
访问表的成员
通过“.”或者“[]”运算符来访问表的成员。
注意:表达式a.b等价于a[“b”],但不等价于a[b]
表项的键和值
任何类型的变量,除了nil,都可以做为表项的键。从简单的数值、字符串
到复杂的函数、表等等都可以;同样,任何类型的变量,除了nil,都可以
作为表项的值。给一个表项的值赋nil意味着从表中删除这一项,比如令a.b
= nil,则把表a中键为“b”的项删除。如果访问一个不存在的表项,其值
也是nil,比如有c = a.b,但表a中没有键为“b”的项,则c等于nil.
深入lua的函数
lua中的函数---函数闭包(函数的超集,由函数定义和upvalue组成函数闭包 ) 带状态的函数 和对象类似
Upvalue
一个函数所使用的定义在它的函数体之外的局部变量(external local variable)称为这个函数的upvalue。ms就是countDown的upvalue
闭包其实和类的概念相识,都是数据和方法的封装
- lua中的函数是 第一类值 和其他(数值,布尔)一样。 可以轻易的重新定义函数的引用
- 可以在创建闭包的时候,动态的给upvalue复制,如下createCountdownTimer创建了有不同upvalue的闭包 。(同理 lua能够动态的创建不同的闭包函数 )
- 一个函数内可以定义两个闭包公用一个upvalue实现数据共享。 (如下f1,和f2共享一个upvalue)
lua函数:尾调用消除,最后一个函数调用 没有栈调用消耗
简单的面相对象的实现
输出结果:
o1's name: Sam o1's id: 1
o1's name: Lucy o1's id: 100
对象工厂模式
如前面代码的create函数
用表来表示对象
把对象的数据和方法都放在一张表内,虽然没有隐藏私有成员,但对于简单
脚本来说完全可以接受。
成员方法的定义
function obj:method(a1, a2, ...) … end 等价于
function obj.method(self, a1, a2, ...) … end 等价于
obj.method = function (self, a1, a2, ...) … end
成员方法的调用
obj:method(a1, a2, …) 等价于
obj.method(obj, a1, a2, ...)
lua其他的重要概念
lua的元表,lua函数环境 ,lua包, lua的协程
浙公网安备 33010602011771号