这篇文章是我去年学习Lua 语言时候记下的笔记 Markdown 版本的可能被我误删了,只剩下了文字版,markdown版当时保存了一个 PDF,可以使用下面的链接下载(更美观) https://www.my-synology.cn:37443/sharing/3I8q4i1Xd 一共有 56 页,同时推荐给大家一本书 《Lua 程序设计第四版》
1. Hello World
1.1 如何执行一段Lua代码
1)交互模式下直接输入要执行的代码
2)lua demo.lua
3)使用dofile函数进行执行,例如 dofile("demo.lua")
1.2 一些词法规范
标识符(或名称)规范:任意字母、数字、下划线组成,不能以数字开头
一般
下划线 大写字母 被用作特殊用途,尽量咱们就不要用
下划线 小写字母 被用作哑变量(Dummy variable)
还有一些保留字,不能被设置为标识符
and break do else elseif end false goto for function if in local nil not or repeat return then true until while
Lua是大小写敏感的,比如 And 和 AND是两个不同的标识符
1.3 注释符
lua 中使用 -- 来表示单行注释
--[[多行注释]]
多行注释小技巧
在注释多行代码的时候,可以使用以下方式进行
--[[
print("codes")
--]]
这样的话,如果我们需要重新释放这段代码,只需要在第一行多加一个 - ,变成如下:
---[[
print("codes")
--]]
1.4 分隔符
在Lua语言中,连续语句之间的分隔符并不是必需的。如果有需要的话可以使用分号来进行分隔,换行其实是没啥用的
下面四个都是合法且等价的
---------------
a = 1
b = a * 2
---------------
a = 1;
b = a * 2;
---------------
a = 1; b = a * 2
---------------
a = 1 b = a * 2 -- 虽然可读性不佳,但是却是正确的
---------------
1.5 全局变量
Lua 中全局变量无须声明即可使用,使用未经初始化的全局变量也不会导致错误。当使用未经初始化的全局变量时,得到的结果是 nil
---------------
~ ❯❯❯ lua
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
> print(b)
nil
----------------
Lua 对于全局变量的回收可以直接将该全局变量赋值 nil
1.6 类型和值
Lua 语言一共有 8 种基本类型:
nil
boolean
number
string
userdata
function
thread
table
使用type函数可以直接获取一个值对应的类型名称
type(nil) --> nil
type(true) --> boolean
type(10.4 * 3) --> number
type("Hello World") --> string
type(io.stdin) --> userdata
type(print) --> function
type(type) --> thread
type({}) --> table
type(type(x)) --> string
关于 userdata
这种类型可以把任意C语言数据保存在Lua语言变量中,这个类型被用来被用来表示由应用或C语言编写的库所创建的新类型
,比如标准I/O库使用用户数据来表示打开的文件
关于 boolean ,false 和 nil 以外的所有其他值都视为真。没错。你没有看错。在条件检测中 Lua 语言把零和空字符串也都视为真
and or not 逻辑运算符的结果
【 and 】
> a and b
如果 a 为 false,则返回a;否则返回b;如果都为 nil,那么返回 nil
> 4 and 5
5
> nil and 5
nil
> nil and nil
nil
> false and nil
false
>
【 or 】
a or b
如果a为true,则返回a,否则返回b
> 4 or 6
4
> nil or 6
6
> false or 6
6
> false or nil
nil
>
其实就是遵循最短求值原则,即只在必要时才对第二个数进行求值
所以 Lua 中形如 x = x or v 这种非常常用
等价于 if not x then x = v end
1.7 独立解释器
说白了就是用来执行lua代码的程序
lua [options] [script [args]]
这里要说一下
1.7.1 -e 参数允许我们用来直接在命令行一句话执行代码
--------------------------------------
~ ❯❯❯ lua -e 'print("aaa")'
aaa
~ ❯❯❯
----------------------------------------
在 POSIX 系统(可移植操作系统接口)下需要使用双引号,以防止shell错误解析括号
1.7.2 -l 参数
这个参数用于加载库文件
1.7.3 -i 参数
这个参数用于在执行完其他命令行参数后进入交互模式
----------------------------------------
~ ❯❯❯ lua -i -e "x = 10; print(x)"
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
10
>
-----------------------------------------
默认情况下交互模式下会输出结果,如果不想输出,可以在表达式后面加一个分号,分号使得最后一行在语法上变成了无效表达式,但可以被当作有效的命令执行
-----------------------------------------
> io.flush()
true
> io.flush();
------------------------------------------
Lua 解释器在处理参数前,会查找两个环境变量,一个是 LUA_INIT_5_3 ;另一个是LUA_INIT 。先查找 LUA_INIT_5_3,如果找不到再查找 LUA_INIT,如果其中任意一个存在,则会审查其中的内容,如果是以 @filename 开头,那么解释器就会运行对应的文件了;如果环境变量存在,但是内容不是以 @filename 开头的,那么解释器会认为其中包含 Lua 代码,并且会对其中的文件进行解释执行
这样的话我们可以通过这两个环境变量完整地配置Lua,比如我们可以预先加载程序包、修改路径、定义自定函数、对函数进行重命名或删除函数等
我们可以通过预先定义的全局变量arg 来获取解释器传入的参数。例如,执行一下命令时
lua demo.lua a b c
全局变量 arg 中 arg[0] 永远是指 脚本名称
所以以上命令对应的arg 中的位置为
arg[-1] = lua
arg[0] = demo.lua
arg[1] = a
arg[2] = b
arg[3] = c
2.数值
2.1 数值常量
Lua 5.3 版本开始,数值格式分为两种选择,一种为 64为 interger ,另一种为 float 双精度浮点类型
整数型和浮点型数值都是 number ,要区分整数值和浮点型时,可以使用 math.type(a) 进行确认
-----------------------
~ ❯❯❯ lua
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
> math.type(5)
integer
> math.type(5.3)
float
>
------------------------
整数和浮点数可以相互转化,具有相同算数值的整数型和浮点型值在 Lua 语言中是相等的
------------------------
> 1 == 1.0
true
> -3 == -3.0
true
> -3 == - 3.1
false
> 0.2e3 == 200 (e3表示十的三次方)
true
------------------------
对于十六进制数的支持
Lua 支持 0x 开头的十六进制数,同时,与其他语言不同的是:Lua 语言还支持十六进制的浮点数,这种十六进制的浮点数由小数部分和以 p 或 P 开头的指数部分组成。例如:
------------------------
~ ❯❯❯ lua
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
> 0xff
255
> 0x1A3
419
> 0x0.2
0.125
> 0x1p-1
0.5
> 0xa.bp2
42.75
>
还可以使用 string.format 函数对 %a 参数进行格式化输出,这种输出可以保留所有浮点数的精度
----------------------------------------------------
> string.format("this is a number:%a", 419)
this is a number:0x1.a3p 8
>
----------------------------------------------------
2.2 算术运算
除了基本的加、减、乘、除,Lua 还支持 floor 除法,这个除法的结果就是负向无穷取整
----------------------------------------------------
> 3//2
1
> 3.0//2
1.0
> 6//2
3
> 6.0//2.0
3.0
> -9//2
-5
> 1.5//0.5
3.0
>
------------------------------------------------------
a % b == a - ((a // b) * b)
圆周率pi math.pi
2.3 关系运算
Lua 语言提供了下列关系运算
< > <= >= == ~=
运算的结果都是 Boolean 类型
~= 是不等于
2.4 数学库
Lua 语言的标准数学库是 math。其中包括三角函数 (sin、cos、tan、asin等)、指数函数、取整函数、最大和最小函数max 和 min、用于生成伪随机数的伪随机数函数(random)以及常量pi和huge(最大数值,在大多数平台上代表 inf)
2.4.1 随机数发生器
函数 math.randon 用于生成伪随机数,共有三种调用方式
1) 直接调用
--------------------------------------------
> math.random()
0.84018771676347
> math.random()
0.39438292663544
> math.random()
0.78309922339395
> math.random()
0.79844003310427
>
----------------------------------------------
2) 使用random(x) 这种方式选择一个 1-x之间的一个整数
-----------------------------------------------
> math.random(5)
5
> math.random(5)
1
> math.random(5)
2
> math.random(5)
4
> math.random(5)
2
>
-----------------------------------------------
3) 使用 random(3,7),选择 3-7 中任意整数
-----------------------------------------------
> math.random(3,7)
5
> math.random(3,7)
5
> math.random(3,7)
6
> math.random(3,7)
4
> math.random(3,7)
5
> math.random(3,7)
7
>
-------------------------------------------------
2.4.2 取整函数
floor、ceil、modf
--------------------
floor 向负无穷取整
ceil 向正无穷取整
modf 向零取整
--------------------
> math.floor(3.3)
3
> math.ceil(3.3)
4
> math.modf(3.3)
3 0.3
>
--------------------
2.5 表示范围
标准lua 使用64个bit位来存储整数值, 2的63次方减一
3. 字符串
Lua 使用 8 个bit 来进行存储。Lua 可以存储任何编码的字符串
长度操作符 # 可以用来获取字符串长度
---------------------
~ ❯❯❯ lua
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
> a = "hhhhhh"
> #a
6
>
----------------------
.. 两个点用来进行字符串拼接,如果拼接的不是字符串而是数值,那么lua会将数值转化为字符串
3.1 字符串常量
单引号双引号都可以用来声明字符串常量
a = "Hello world"
b = 'Hell old'
------------------------
> a = "this is 'danyinhao'"
> a
this is 'danyinhao'
> b = 'this "aaa"'
> b
this "aaa"
>
--------------------------
LUA 语言中的字符串支持,字符串支持一些C语言的转义字符
a
b
f
n 换行
r 回车
t
v 垂直制表符
\
"
'
LUA中还可以童年各国转义序列 ddd和xhh 的方式来声明字符串
10 代表换行符,类似的表达还有 char(10)
x4f
在一个使用ascii编码的系统中, "AL0n123"" 和 'x41L010 4923' 实际上是一样的
x41 是十六进制的65,在ascii中是 A
10 是换行符