概述
Lua作为轻量级脚本语言,凭借简洁语法和高效性能被广泛应用于游戏开发、嵌入式系统等领域
本文聚焦四大核心语法模块,通过示例代码带你快速掌握变量定义、控制逻辑与函数高级用法
变量与数据类型:构建Lua世界的基础单元
Lua采用动态类型系统,无需声明变量类型,赋值即可创建变量
以下是开发中最常用的四种类型:
| 类型 | 描述与特点 | 示例代码 | 应用场景 |
|---|---|---|---|
| nil | 唯一无效值,未赋值变量默认为此类型 | x = nil | 清除变量、判断是否存在 |
| number | 双精度浮点数,支持整数与小数 | score = 95.5; count = 100 | 数值计算、索引存储 |
| string | 单/双引号包裹,支持多行字符串 | “hello” … ‘world’ | 文本处理、配置文件 |
| table | 关联数组,可作为数组/字典/对象使用 | player = {name=“Alice”, hp=100} | 数据结构、模块组织 |
| boolean | 布尔值,仅 true 和 false | flag = true | 用于真值判断 |
补充说明:nil 在条件判断中被视为 false,其他值均为 true,甚至连 0 和空字符串 " " 也是如此
1 ) nil:表示无效值或未初始化变量,唯一实例为nil。如 local x 默认值为 nil
2 ) number:双精度浮点数(无独立整数类型),支持数学运算:
local score = 98.5
local hex = 0xFF -- 十六进制表示
3 ) string:不可变序列,用单/双引号或[[多行文本]]定义:
local msg = "Hello"
local multi_line = [[Line1
Line2]]
print(#msg) --> 5 (长度操作符)
4 ) table:核心数据结构,可作数组、字典或混合体:
local arr = {10, 20, 30} -- 索引从1开始
local dict = {name="Alice", age=25}
print(arr[1], dict["name"]) --> 10, Alice
5 )boolean:
--- 基本布尔值判断
print(not nil) --> true
print(not false) --> true
print(not 0) --> false (0 为真)
print(not "") --> false (空字符串也为真)
--- 非布尔值的真假判断
print(true and false) --> false
print(true or false) --> true
print(not true) --> false
--- 逻辑运算符的使用
print(true and false) --> false
print(true or false) --> true
print(not true) --> false
--- 实用技巧:默认值赋值
local name = nil
name = name or "Anonymous"
print(name) --> Anonymous
--- 短路特性示例
local a = false
local b = true
print(a and b) --> false(因为 a 为 false,不会判断 b)
print(a or b) --> true(因为 a 为 false,继续判断 b)
要点总结
| 操作 | 说明 | 示例 |
|---|---|---|
| true / false | 基本布尔值 | if true then … |
| not | 取反 | not false → true |
| and | 左为假则返回左,否则返回右 | false and true → false |
| or | 左为真则返回左,否则返回右 | nil or “default” → “default” |
| 默认值技巧 | 利用 or 设置默认值 | name = name or “Guest” |
关键特性
- 变量默认全局,用 local 声明局部变量(推荐优先使用)
- 字符串连接使用…(如"a"…“b"结果为"ab”),长度计算用#(如#"test"返回4)
- Table通过{}创建,索引从1开始,支持混合索引(数字+字符串键)
控制结构:流程控制的核心逻辑
Lua提供简洁的条件与循环语句,语法贴近自然语言:
1 ) 条件语句(if-else)
local age = 18
if age >= 18 then
print("成年")
elseif age > 0 then
print("未成年")
else
print("无效年龄")
end -- 输出:成年
2 ) 循环语句(for/while/repeat)
| 循环类型 | 语法格式 | 适用场景 |
|---|---|---|
| for数值循环 | for i=1,5 do … end | 固定次数迭代 |
| for泛型循环 | for k,v in pairs(table) do … end | 遍历table键值对 |
| while循环 | while condition do … end | 条件为真时持续执行 |
| repeat-until | repeat … until condition | 至少执行一次后判断条件 |
2.1 数值型 for 循环:
for i = 1, 5 do
print(i)
end
2.2 泛型 for 循环(常用于遍历 table):
t = {"apple", "banana", "cherry"}
for index, value in ipairs(t) do
print(index, value)
end
2.3 while循环:条件前置
local i = 1
while i <= 5 do
print(i)
i = i + 1
end
2.4 repeat-until:条件后置(至少执行一次)
repeat
print("Execute at least once")
until false
循环控制:break跳出循环(无continue,可用if模拟)
实战技巧
使用break跳出循环,continue需通过if模拟(Lua 5.2+支持)
泛型循环中,ipairs用于数组(有序),pairs用于字典(无序)
函数:从基础定义到闭包
函数是Lua的一等公民,支持多返回值、可变参数和闭包特性。
基础定义与调用
--- 定义求和函数
function add(a, b)
return a + b -- 单返回值
end
--- 多返回值函数
function getInfo()
return "Lua", 26 -- 返回语言名与年龄
end
local lang, age = getInfo() -- lang="Lua", age=26
闭包:函数与环境的绑定
function createCounter()
local count = 0 -- 局部变量,被闭包捕获
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- 1
print(counter()) -- 2 -- 状态持续保留
闭包(Closure)是 Lua 中一个强大特性,它允许函数“记住”其外部作用域中的变量,形成封装状态的能力。
高级特性
- 函数可赋值给变量或作为参数传递(如table.sort(t, func))
- 可变参数用…表示,通过select(“#”, …)获取参数个数
高级技巧
1 ) 示例代码:多返回值 + 可变参数函数
-- 定义一个可变参数函数,返回所有参数的最大值及其索引
function find_max(...)
local args = {...} -- 将参数打包为表
local max_val = args[1]
local max_index = 1
for i, v in ipairs(args) do
if v > max_val then
max_val = v
max_index = i
end
end
return max_val, max_index -- 返回多个值
end
-- 调用函数
local max_value, index = find_max(10, 5, 99, 23, 45)
print("最大值是:", max_value) --> 最大值是: 99
print("索引是:", index) --> 索引是: 3
说明:
- … 是可变参数的关键,用 {…} 可将其转为表处理
- find_max(…) 接收任意数量参数,找出最大值并返回值和索引
- local max_value, index = … 展开了函数的多个返回值
2 ) unpack 与可变参数配合使用
function sum_all(...)
local args = {...}
local total = 0
for _, v in ipairs(args) do
total = total + v
end
return total
end
local nums = {10, 20, 30}
print(sum_all(unpack(nums))) --> 60
unpack 用于将表展开为函数参数,在 Lua 5.2+ 中推荐使用 table.unpack
总结要点
| 特性 | 语法/方法 | 示例 |
|---|---|---|
| 可变参数 | function f(…) | local args = {…} |
| 多返回值 | return a, b | x, y = func() |
| 展开参数 | unpack(tbl) | func(unpack(nums)) |
3 ) 高级
function max_min(...)
local nums = {...} -- 把可变参数转换为表 [[12]]
if #nums == 0 then
return nil, nil -- 如果没有参数,返回两个 nil
end
return math.max(table.unpack(nums)), math.min(table.unpack(nums))
end
-- 示例调用:
print(max_min(3, 1, 4, 1, 5)) --> 输出:5 1
开发建议与最佳实践
性能优化:优先使用局部变量减少全局表查询开销
代码规范:函数名用小写+下划线,常量用全大写(如MAX_HEALTH = 100)。
调试工具:推荐VS Code+LuaPanda插件,支持断点调试与代码补全
学习资源:官方文档《Programming in Lua》+ ZeroBrane Studio实时编码环境
核心语法速查表(精华总结)
| 语法模块 | 关键知识点 | 示例代码片段 |
|---|---|---|
| 变量声明 | 全局变量/局部变量 | local x = 10; y = 20 |
| 字符串操作 | 连接与长度 | print(“a”…“b”, #(“hello”)) |
| 数据类型 | nil / number / string / table / boolean 等 | type(x) |
| 条件控制 | if, elseif, else | if x > 0 then … end |
| 循环控制 | for, while, repeat-until | for i=1,10 do … end |
| 函数 | 支持匿名函数、闭包 | function fn() … end |
| Table遍历 | ipairs/pairs | for i,v in ipairs(arr) do |
| 表(table) | 可作数组或字典 | t = { key = “value” } |
| 匿名函数 | 作为参数传递 | table.sort(t, function(a,b) return a < b end) |
1067

被折叠的 条评论
为什么被折叠?



