为了编译(注:Lua 本身是一门解释型语言,这里的编译指的是生成 bytecode)和执行 Lua 代码,首先需要获取 Lua 的编译器 luac 以及解释器 lua。
考虑到兼容性,这里直接从源码进行编译。
- Windows
- 安装 mingw 并配置必要的环境变量
- 从 Lua: download 下载最新的源码压缩包并解压
- 打开根目录下的 Makefile,将
PLAT= guess修改为PLAT= mingw - 打开 CLI,执行命令
make - 将
src目录下生成的三个文件lua.exe、luac.exe和lua54.dll移动到合适的地方
- Linux
-
使用
sudo apt install lua5.4 -
或使用官方提供的 shell 脚本:
curl -L -R -O https://www.lua.org/ftp/lua-5.4.7.tar.gz tar zxf lua-5.4.7.tar.gz cd lua-5.4.7 make all test
-
然后配置好环境变量(如果必要)。
在 CLI 执行 lua -v 以验证安装是否成功,在我的电脑上,输出 Lua 5.4.7 Copyright (C) 1994-2024 Lua.org, PUC-Rio。
- Lua 解释器
lua支持类似 python 的交互模式:在 CLI 下执行lua即可 - 在交互模式下,所有输入的代码在按下回车后都会被立即执行
- 可以通过
os.exit()退出交互模式,或者使用CTRL+Z(Windows)或CTRL+D(Linux)
Windows 下:
CTRL+C:向当前进程发送SIGINT,中断当前进程CTRL+Z:向当前进程发送EOF,代表输入结束CTRL+D:无特殊用途
Linux 下:
CTRL+C:向当前进程发送SIGINTCTRL+Z:向当前进程发送SIGTSTP,暂停当前进程,可使用SIGCONT恢复CTRL+D:向当前进程发送EOF,代表输入结束
- 输入
lua <代码文件路径>以执行预先写好的 Lua 代码文件 - 输入
lua -i <代码文件路径>以执行预先写好的 Lua 代码文件,并在执行完毕后进入交互模式,这样就能查看代码执行完毕后各变量的值,对于调试会很有帮助 - 在交互模式下,执行
dofile("<代码文件路径>")也能实现同样的效果
- 标识符是由任意英文字母、数字和下划线组成的、大小写敏感的字符串,并且不能以数字开头
- 标识符也不能与 Lua 保留字(关键字)重名,具体可参照官方文档
- 下划线 + 大写字母的标识符具有特殊用途(如 _VERSION 表示当前 Lua 的版本)
-
使用
-- abcdefg进行单行注释 -
使用
--[[ abcdefg ]]进行多行注释 -
小技巧:可以使用
--[[ abcdefg --]]
进行多行注释,这样只需要在最前面加一个
-就能便捷地取消注释。
分号在 Lua 中并不是必需的,但加上也不会有问题。
b = 10将创建一个值为10的全局变量b,其作用域为整个代码文件,可以在该文件的任何地方使用(前提是局部作用域中没有定义重名的变量)- 如果不对其赋值,或手动赋值为
nil,则其值为nil,此时 Lua 的 GC 会自动回收其内存
Lua是一种动态类型语言,即,类型信息被存储在值中,而不是与变量相关联- 总共有 8 种基本类型:
nilbooleannumberstringuserdata:对应 C 语言中的void*类型,用于保存任意的 C 语言数据functionthreadtable
- 可以使用
type函数来获得一个值的类型
- 使用
nil类型来表示一个无效值 - 具有该值的变量不会占用内存(其内存会自动被 GC 回收)
true和false属于boolean类型- 注意,在条件测试中,除了
false和nil以外的值都被认为是真(包含零以及空字符串),这一点和 C 语言的行为不同
not永远返回boolean类型的值- 根据上面的说明,
not 0的结果为false
- 根据上面的说明,
and遵循短路求值原则,当第一个操作数为真时,返回第二个操作数;否则返回第一个操作数or遵循短路求值原则,当第一个操作数为真时,返回第一个操作数;否则返回第二个操作数
利用上述性质,可以优雅地实现许多简单的功能,如:
- C 语言中的
max(x, y)等价于(x > y) and x or y- 实际上这是一种三目运算符的通用表示方法
- 对于
a ? b : c - 在 Lua 中可以写成
a and b or c
x = x or v在x未被初始化时将其设置为v,否则不操作
-
可以在执行代码时传递命令行参数:
lua <代码文件路径> a b c -
解释器会创建一个名为
arg的表,其内容如下:arg[-1] = "lua" arg[0] = "<代码文件路径>" arg[1] = "a" arg[2] = "b" arg[3] = "c"