Lua分支和版本
- Lua有诸多版本和分支,其中最著名的当属以下三个:
- Lua官方版本:Lua: download,由Lua社区维护;
- Windows版:Lua Binaries Download (sourceforge.net)
- Linux版:
apt-get install lua5.4
就可以安装Lua 5.4(最新的大版本)
- LuaJIT:侧重于Lua的解释执行(即时编译)。Download (luajit.org);
- Linux版:同样
apt-get install luajit
- Linux版:同样
- xLua:由腾讯公司开发,用于Unity程序内嵌Lua。Tencent/xLua (github.com)
- Lua官方版本:Lua: download,由Lua社区维护;
- Lua不存在官方创建的、给第三方库提供托管服务的网站(类比npm)。常用的第三方库的获取和安装主要有以下两种办法:
- 从源码安装。这包括:
- 纯Lua库,下载、解压到require加载路径下,导入即可;
- C库,下载、配合Lua源码(
lua.h
等)进行编译(Linux下会生成.so
文件),设置package.cpath
,然后导入;- C库需要的Lua源码,Linux下可以通过
apt-get install liblua5.4-dev
来安装;
- C库需要的Lua源码,Linux下可以通过
- LuaRocks平台,可以当作第三方包管理器(Package Manager)使用
- 建议Linux平台下载源码并编译安装:
- 从源码安装。这包括:
1 | sudo apt-get install liblua5.4-dev |
- IDE:一般很少使用IDE来编写Lua代码,但可以参考:
- 文本编辑器+LSP Server,如NeoVim;
- 调试器,如slembcke/debugger.lua (github.com)
- 一些成型的IDE,但往往不能支持最新版本Lua,如ZeroBrane Studio
语言特性
- Lua是解释型语言;
- 因此,Lua也是有opcode和bytecode的,运行在VM之上;
- lua/lopcodes.h at master · lua/lua
- luac和luajit也可以编译
.lua
,但执行仍需解释器(可以理解为类似.py
到.pyc
的过程);
- Lua解释器本体极小,且完全由C语言写成,因此可以很方便的:
- 嵌入到其他大型程序中,如文本编辑器、游戏、开发工具等等;
- 与高性能的C语言程序结合,拓展其功能,如nginx-lua-module;
- 使用其编写功能完善的程序,并应用于嵌入式系统中,如openwrt的luci便是cgi+lua;
- Lua语言是弱类型语言
- Lua语言是面向过程的语言,但可以模拟面向对象
- Lua的版本与版本之间差异较大
- 运行于官版Lua上的库,可能无法兼容luajit或xLua;
- 运行于Lua 5.1上的库,可能无法兼容Lua 5.2(不向后兼容);
- 同样地,运行于Lua 5.2上的库,可能无法兼容Lua 5.1(不向前兼容);
基本结构
- 由于不同的Lua分支可能在语法上有差异(甚至可能有不同的opcode),所以此处以官方版本语法为准
注释
- 单行注释:
--
1 | -- Test |
- 多行注释:
--[[ --]]
1 | --[[ |
数据类型
- Lua共有8个基本类型
nil
:表示无效值/值不存在,可转换为布尔型的false
- 未初始化的变量,访问即可得到其值
nil
- 将
nil
赋值给变量等同于将该变量删除,此后内存空间会被GC(垃圾回收器)自动回收
- 未初始化的变量,访问即可得到其值
boolean
:布尔型,值为true
或者false
number
:数字类型,保存一切数字数据,为双精度浮点型(即C中的double
)string
:字符串。双引号或单引号包裹字符串字面量。function
:函数,类似于C中的函数指针(只不过不需要各种间接访问符)。既可以是Lua中定义的函数,也可以是C插件中定义的函数。thread
:非抢占式协程(用户态线程),变量本身可看作是协程的handler。- Lua实现抢占式多线程(甚至是多进程)需要使用第三方库
- 协程只能支持并发(时间段内同时)而不支持并行(时间点上同时)
- Lua Lanes - multithreading in Lua
table
:表,Lua中最重要的数据类型之一,兼具数组和Map的特征,同时可以用于模拟面向对象编程userdata
:纯内存空间。主要用于Lua环境与C插件间的变量交互,例如在Lua中给C插件生成的C语言结构体开辟空间- 判断变量的类型:
type(xxx)
变量及其赋值
- Lua变量赋值时均不用指定数据类型。以下是最简单的、合法的变量定义语句:
1 | a = 10 |
- 变量只有两种作用域类型:局部变量、全局变量。没有被
local
关键字修饰的变量均是全局变量
1 | a = 10 --全局变量 |
- 赋值语句:分为单值赋值语句和多值赋值语句
- 单值赋值语句:与C语言几乎相同:
task.m_1 = task.m_1 + 2
- 多值赋值语句:可同时定义并初始化多个变量:
a, b, c = 10, 2 + 2, 3.14
- 多值赋值语句的特例:
- 可以用于快速交换两个变量的值:
x, y = y, x
- 变量个数少于值的个数,多余的值会被忽略:
a, b = 10, 11, 12
,12会被忽略 - 变量个数多于值的个数,多余的变量不会被定义
- 可以用于快速交换两个变量的值:
- 单值赋值语句:与C语言几乎相同:
[[TODO]]