Lua学习笔记
Lua在设计上,从一开始就把简洁、高效、可移植性、可嵌入型、可扩展性等作为自己的目标。
数据类型
表、函数、线程、以及完全用户数据在 Lua 中被称为对象:变量并不真的持有它们的值,而仅保存了对这些对象的引用。 赋值、参数传递、函数返回,都是针对引用而不是针对值的操作, 这些操作均不会做任何形式的隐式拷贝。
基本类型 | 描述 | |
---|---|---|
数值(number) | 内部以double表示 | |
字符串(string) | 总是以零结尾,但可以包含任意字符(包括零),因此并不等价于C字符串, 而是其超集 | |
布尔(boolean) | 只有“true”或者“false”两个值。nil → false,others → true | |
函数(function) | Lua的关键概念之一。不简单等同于C的函数或函数指针。 | |
表(table) | 异构的Hash表。Lua的关键概念之一。 | |
userdata | 用户(非脚本用户)定义的C数据结构。脚本用户只能使用它,不能定义。 | |
线程(thread) | Lua协作线程(coroutine),与一般操作系统的抢占式线程不一样。 | |
nil | 为初始化的值,逻辑值为false。 |
and 且&&
or 或||
not 取反!
函数
- 函数用关键字function定义函数,以关键字end结束
- 局部变量用关键字local定义。如果没有用local定义,即使在函数内部定义的变量也是全局变量!
- 函数可以返回多个值:
1 | function (a,b,c,...) |
表
定义表(Table)的方式
1 | local b = { x = 1, ["hello"] = "world!" } |
访问表的成员
通过“.”或者“[]”运算符来访问表的成员。
1. 注意:表达式a.b等价于a[“b”],但不等价于a[b]
- 除了nil,都可以作为表项的键和值
- 给一个表项的值赋nil意味着从表中删除这一项,比如令
b.x = nil
,则把表b中键为“x”的项删除。 - 如果访问一个不存在的表项,其值也是nil,比如有c = a.b,但表a中没有键为“b”的项,则c等于nil。
- 键值对之间使用等号。
字符串
字符串的链接..
1 | local str = "Hi " .. "Lua" -- Hi Lua |
字符串的截取,索引从1开始
1 | string.sub(str, fromIndex [, endIndex]) |
1 | string.sub("Hello Lua user", 7) -- Lua user |
常用方法
1 | string.len("Alma") -- "4" |
简写格式
1 | mystring = "alma" |
1 | math.pow(x,y) -- x的y次方 |
表
键值为变量或者数字必须用[]
括起来
可以用逗号和分号分割
字符串引号可以被省略
1 | empty = {} |
表是 Lua 中唯一的数据结构, 它可被用于表示普通数组、序列、符号表、集合、记录、图、树等等。 对于记录,Lua 使用域名作为索引。 语言提供了 a.name 这样的语法糖来替代 a[“name”] 这种写法以方便记录这种结构的使用。
table[“k”]==table.k
print(table.from)
print(table[‘from’])
1 | array = {'a', 'b', 'c'} |
ipairs 隐式索引,从一开始,索引都为正整数
函数
1 | function f(...) -- any number of parameters |
元表及元方法
Lua 中的每个值都可以有一个元表。 这个元表就是一个普通的 Lua 表, 它用于定义原始值在特定操作下的行为。 如果你想改变一个值在特定操作下的行为,你可以在它的元表中设置对应域。 例如,当你对非数字值做加操作时, Lua 会检查该值的元表中的 “__add” 域下的函数。 如果能找到,Lua 则调用这个函数来完成加这个操作。