一、基本语法
- 常识和解析器
- 全局变量不需要申明,直接赋值即可创建,删除变量直接赋nil。未申明的变量不会报错,直接返回nil。
-
lua保留字使用下划 线加大写字母的标示符,letter 的含义依赖本地环境的。
-
单行注释:-- 多行注释:--[[ --]]
-
解析器常见参数
- -i] 用于调试和手工测试;
- [-e] 直接输入代码,如:lua -e “print(“hello”)”;
-
[-l] 加载一个lua程序库;
-
常见类型和值:nil(空)、boolean(布尔)、number(数字)、string(字符串)、userdata(自定义类型)、function(函数)、table(表)、thread(线程)。
-
nil是一种类型,只有一个值nil,在lua中也叫无效值。将nil赋给一个变量,可删除变量。
-
table(表):为整数索引时,可理解为数组;为字符串索引时,可理解为字典。还可实现一些较复杂的数据结构,如:队列、栈、集合、字典等
-
function(函数):作为一类值,可以存储在变量中,支持参数传递或返回值,
-
string(字符串):支持单引号、双引号、[[和]],可多行不支持转义、[[…]],可防止字符串中出现代码注释、“…”用于连接字符串
-
number(数字):lua不区分整数和浮点数,只有普通表示法和科学技术法的区分
-
boolean(布尔):boolean类型只有2个值:false和true。在条件表达式中,只有值为false和nil为“假”
-
- 表达式:算术运算符、关系运算符、逻辑运算符(and/or/not)、连接运算符(..)、
-
逻辑运算符认为 false 和 nil 是假(false),其他为真,0 也是 true.
-
-
语法:赋值、局部变量、控制语句
- 多重赋值:若值的个数少于变量的个数,那么多余的变量会赋为nil;若值的个数更多的话,那么多余的值丢弃。
- 局部变量用local作限定,其作用域仅限于声明它们的那个块,一个块就是do...end构成。
- lua支持数字型for & 泛型for
-
模拟switch,用函数和table来实现;模拟contionue,用do…end包住整个for块
-
函数(第5、6章):
-
多返回值(类似python):将函数作为单独一条语句时,丢弃所有返回值;如果函数调用不是一系列表达式的最后一个元素,那么将只产生一个值。“一系列表达式”在Lua中表现为4种情况:多重赋值、函数调用时传入的实参列表、table的构造式和return语句。
-
可变参数:用3个点…表示变长参数
-
具名形参:在调用一个函数时,实参是通过参数表中的位置取匹配形参的
-
closure闭包:一个closure就是一个函数加上该函数所需访问的所有“非局部的变量”。
-
非全局函数:存储在table的字段和局部变量的函数
-
正确的尾调用:在函数结尾的 goto 调用,当函数最后一个动作是调用另外一个函 数时,我们称这种调用尾调用。
-
-
迭代器和泛型for
-
迭代器的每次调用返回集合的下一元素。迭代器的每次调用会创建一个闭包
-
泛型for 在自己内部保存迭代函数,它保存三个 值:迭代函数、状态常量、控制变量。
-
无状态迭代器:函数都是用两个变量(状态常量和控制变量)的值作为参数被调 用,一个无状态的迭代器只利用这两个值可以获取下一个元素。
- 多状态迭代器:使用table实现
-
- 编译、运行、错误信息
- lua是一种解释性语言,lua会进行代码预编译,再执行。
- package & error. pcall + try catch
- 协同程序:类似多线程程序,有独立的堆栈和局部变量,共享全局信息。
-
线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线 程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协 同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起。
-
协同有三个状态:挂起态(suspended)、运行态(running)、停止态(dead)
-
二、table & object
- 数据结构
-
数组:使用整数来索引table即可在Lua中实现数组,可动态增长。
-
矩阵与多维数组:一个table中的每个元素是另一个table。或者使用特定的运算方法构造单一的索引值
-
链表:每一个节点是一个 table,指针是这个表的一个域 (field),并且指向另一个节点(table)。
-
队列:使用两个索引下标,一个表示第一 个元素,另一个表示最后一个元素。
-
集合和包:将所有集合中的元素作为下标存放在 一个 table 里
-
字符串缓冲:用一个栈,在栈的底部用来保存已经生成的大的字符串,而小的串从栈定 入栈。
-
-
数据文件与持久化
-
元表和元方法
-
任何一个表都可以是其他一个表的 metatable,一组相关的表可以共享一个 metatable
-
可以通过元表来修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定的操作
-
可以使用setmetatable来设置或修改任何table的元表。
-
在Lua代码中,只能设置table的元表。若要设置其他类型的值的元表,则必须通过C代码来完成
-
-
环境:
-
Lua将其所有的全局变量保存在一个常规的table中,这个table称为“环境(environment)”。
-
Lua中的全局变量不需要声明就可以使用。
-
Lua将全局变量存放在一个普通的table中,则可以通过元表来改变其访问全局变量时的行为。
-
-
包:模块系统的一个主要目标是允许以不同的形式来共享代码。包就是一系列模块。
-
创建一个table,并将所有需要导出的函数放入其中,最后返回这个table。
-
可以在package中添加私有成员
-
通常写一个 package ,将所有的代码放到一个单独的文件中,执行这个文件即可加载 package。
-
可以将所有的公有函数声明为全局 变量,然后他们会自动作为独立的表(表指 package 的名字)存在,所有 package 必须 要做的是将这个表注册为 package 的名字。
-
-
面向对象:table就是一种对象
-
table可以拥有状态。
-
table拥有一个独立于其值的标识(一个self)。
-
table具有独立于创建都和创建地的生命周期。
-