Lua: 核心语法之变量、控制流与函数闭包实战精解

概述


Lua作为轻量级脚本语言,凭借简洁语法和高效性能被广泛应用于游戏开发、嵌入式系统等领域
本文聚焦四大核心语法模块,通过示例代码带你快速掌握变量定义、控制逻辑与函数高级用法

变量与数据类型:构建Lua世界的基础单元


Lua采用动态类型系统,无需声明变量类型,赋值即可创建变量

以下是开发中最常用的四种类型:

类型描述与特点示例代码应用场景
nil唯一无效值,未赋值变量默认为此类型x = nil清除变量、判断是否存在
number双精度浮点数,支持整数与小数score = 95.5; count = 100数值计算、索引存储
string单/双引号包裹,支持多行字符串“hello” … ‘world’文本处理、配置文件
table关联数组,可作为数组/字典/对象使用player = {name=“Alice”, hp=100}数据结构、模块组织
boolean布尔值,仅 true 和 falseflag = 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-untilrepeat … 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, bx, 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, elseif x > 0 then … end
循环控制for, while, repeat-untilfor i=1,10 do … end
函数支持匿名函数、闭包function fn() … end
Table遍历ipairs/pairsfor i,v in ipairs(arr) do
表(table)可作数组或字典t = { key = “value” }
匿名函数作为参数传递table.sort(t, function(a,b) return a < b end)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值