Lua是一种嵌入式语言(embedded language),这就意味着Lua并不是一个独立运行的应用,而是一个库,它可以链接到其他应用程序,将Lua的功能融入这些应用。
注释
单行注释,--
多行注释
--[[
多行注释
多行注释
--]]
标示符
标示符以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上0个或多个字母,下划线,数字(0到9)
Lua数据类型
nil 表示一个无效值(在条件表达式中相当于false)
boolean 包含两个值: false和true
number 双精度类型和实浮点数
string 字符串由一对双引号或单引号来表示
function 由C或Lua编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线程,用于执行协同程序
table 关联数组,数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表
数据类型
nil 表示一个无效值(在条件表达式中相当于false)
boolean false和true
number 双精度类型的实浮点数
string 字符串由一对双引号或单引号
function 由C 或 lua 编写的函数
userdata 任意存储在变量中的C数据结构
thread 表示执行的独立线程,用于协同程序
table 关联数组,数组的索引可以是数字、字符串或表类型。在Lua里,table的创建是通过"构造表达式"来完成{}。Lua的table中的数字索引值都是从1开始的,和部分语言的索引值从0开始有所区别。
Lua变量
全局变量
局部变量
表中的域
Lua while循环
while(condition)
do
statements
end
Lua
数值for循环
var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次 "执行体"。exp3 是可选的,如果不指定,默认为1。
for var=exp1,exp2,exp3 do
<执行体>
end
Lua 流程控制
if( 布尔表达式 1)
then
--[ 在布尔表达式 1 为 true 时执行该语句块 --]
elseif( 布尔表达式 2)
then
--[ 在布尔表达式 2 为 true 时执行该语句块 --]
elseif( 布尔表达式 3)
then
--[ 在布尔表达式 3 为 true 时执行该语句块 --]
else
--[ 如果以上布尔表达式都不为 true 则执行该语句块 --]
end
Lua 函数
可以调用Lua语言编写的函数,也可以调用其他语言写的函数
多返回值
可变参数
例:
function add( ... )
local s = 0
for _, v in ipairs{...} do
s = s + v
end
return s
end
print(add(1,2,3))
Lua 运算符
算术运算符
+ 加法
- 减法
* 乘法
/ 除法
% 取余
^ 乘幂
- 负号
关系运算符
== 等于,检测两个值是否相等,相等返回 true,否则返回 false
~= 不等于,检测两个值是否相等,不相等返回 true,否则返回 false
> 大于,如果左边的值大于右边的值,返回 true,否则返回 false
< 小于,如果左边的值大于右边的值,返回 false,否则返回 true
>= 大于等于,如果左边的值大于等于右边的值,返回 true,否则返回 false
<= 小于等于, 如果左边的值小于等于右边的值,返回 true,否则返回 false
逻辑运算符
and 逻辑与操作符。 若 A 为 false,则返回 A,否则返回 B。
or 逻辑或操作符。 若 A 为 true,则返回 A,否则返回 B。
not 逻辑非操作符。与逻辑运算结果相反,如果条件为 true,逻辑非为 false。
Lua 数组
一维数组
多维数组
Lua table(表)
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
Lua table 是不固定大小的,你可以根据自己需要进行扩容。
例 t = {"a", "b", "c", "d"}
#t --输出4
t[#t + 1] = e --就是在t末端插入一个新元素e
当把表当作结构体使用时, 可以把索引当作成员名称使用( a. name 等价于 a["name"])
a.x和a[x]的区别
a.x 代表的是 [“x”] 即由字符串“x”索引的表;
a[x]则是指由变量x对应的值索引的表
例:
a = {} --空表
x = “y”
a[x] = 10 --新元素,键是"y",值是10
a.x nil --字段"x"的值(未定义)
a.y 10 --字段"y"的值
ipairs按照索引升序遍历,索引中断停止遍历。即不能返回 nil,只能返回数字 0,如果遇到 nil 则退出。它只能遍历到集合中出现的第一个不是整数的 key。
例:
local tabFiles = {
[1] = "test2",
[3] = "test3",
[5] = "test1"
}
for k, v in ipairs(tabFiles) do --输出"test2",在key等于2处断开
print(k, v)
end
pairs遍历表,遍历过程中元素的出现顺序可能是随机的
例:
t = {10, print, X = 12, k = "hi"}
for k, v in pairs(t) do
print(k, v)
end
安全访问
我们想确认在指定的库中是否存在某个函数,可以if语句判断。
或者 zip = company or {}
Lua 模块与包
模块类似于一个封装库,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。
require 函数
例:require("<模块名>")
Lua 文件I/O
file = io.open (filename [, mode])
r 以只读方式打开文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
r+ 以可读写方式打开文件,该文件必须存在。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a+ 与a类似,但此文件可读可写
b 二进制模式,如果文件是二进制文件,可以加上b
+ 号表示对文件既可以读也可以写
例:
local f = assert(io.open(filename, "r"))
local t = f:read("a")
f:close()