Lua 是一种轻量级、高效的脚本语言,其解释器核心是用 C 语言编写的,因此具有出色的可移植性和嵌入性(可轻松集成到其他程序中)。以下是其核心语法特性:
一、基础语法特点
-
简洁的语法结构
- 语句以换行或分号结束,无需强制分号。
- 注释:
-- 单行注释
或--[[ 多行注释 ]]
。
-
动态类型系统
- 变量无需声明类型,类型与值绑定:
local a = 10 -- 整数 a = "hello" -- 切换为字符串 a = 3.14 -- 切换为浮点数
- 变量无需声明类型,类型与值绑定:
-
变量作用域
- 默认全局变量,
local
关键字声明局部变量:global_var = 1 -- 全局变量 local local_var = 2 -- 局部变量
- 默认全局变量,
二、核心数据类型
Lua 仅有 8 种基础类型:
nil -- 空值(类似 null)
boolean -- true/false
number -- 整数或浮点数(内部统一为双精度)
string -- 不可变字符串(用单引号或双引号)
function -- 函数(支持闭包)
table -- 表(核心数据结构,可模拟数组、字典、类等)
userdata -- 用户自定义数据(用于与 C 交互)
thread -- 协程(coroutine)
三、表(Table):核心数据结构
表是 Lua 的万能容器,可表示数组、字典、对象等:
-- 数组形式(索引默认从 1 开始)
local arr = {10, 20, "apple"}
print(arr[1]) -- 输出 10-- 字典形式
local dict = {name = "Lua", version = 5.4}
print(dict["name"]) -- 输出 "Lua"-- 混合结构
local mix = {"value1", key = "value2",[3] = 100 -- 显式指定数字索引
}
四、控制结构
-
条件语句
if a > 10 thenprint(">10") elseif a == 0 thenprint("=0") elseprint("<10") end
-
循环
-- while 循环 local i = 1 while i <= 5 doprint(i)i = i + 1 end-- for 循环(数值) for i = 1, 5, 2 do -- 起始值, 结束值, 步长(默认 1)print(i) -- 输出 1, 3, 5 end-- 泛型 for(遍历表) for k, v in pairs(dict) doprint(k, v) end
五、函数与闭包
-
函数定义
function add(a, b)return a + b end-- 匿名函数 local mul = function(a, b) return a * b end
-
多返回值与可变参数
function swap(a, b)return b, a -- 返回多个值 endfunction sum(...) -- ... 表示可变参数local s = 0for _, num in ipairs{...} dos = s + numendreturn s end
-
闭包
function counter()local count = 0return function()count = count + 1return countend endlocal c = counter() print(c()) -- 输出 1 print(c()) -- 输出 2
六、元表(Metatable)与元方法
元表用于自定义表的操作行为(类似运算符重载):
local t1 = {value = 5}
local t2 = {value = 3}-- 定义元表的 __add 方法
local mt = {__add = function(a, b)return {value = a.value + b.value}end
}setmetatable(t1, mt)
setmetatable(t2, mt)local t3 = t1 + t2
print(t3.value) -- 输出 8
七、协程(Coroutine)
Lua 原生支持协程(非抢占式多任务):
local co = coroutine.create(function()print("start")coroutine.yield() -- 挂起协程print("end")
end)coroutine.resume(co) -- 输出 "start"
coroutine.resume(co) -- 输出 "end"
八、模块化
通过 require
加载模块:
-- 定义模块 mymodule.lua
local M = {}
function M.hello()print("Hello from module!")
end
return M-- 使用模块
local mod = require("mymodule")
mod.hello()
总结
Lua 的语法简洁高效,核心特性包括:
- 轻量级:解释器仅数百 KB,适合嵌入式场景。
- 表驱动设计:通过
table
和metatable
实现复杂逻辑。 - 协程支持:简化异步任务处理。
- 易嵌入性:通过 C API 可轻松嵌入其他程序(如游戏引擎、Nginx)。
典型应用场景:游戏脚本(如《魔兽世界》插件)、Redis 脚本、Nginx OpenResty 等。