流程控制语句决定了程序的执行顺序。Lua提供了完整的流程控制结构,包括条件判断、循环和跳转语句。理解这些结构的内部实现和最佳实践对于编写高效、可维护的代码至关重要。
if语句用于根据条件执行不同的代码块。Lua的if语句支持多种形式,从简单的单条件到复杂的多分支判断。
= 18 then print("成年人") end -- if-else语句 local score = 85 if score >= 60 then print("及格") else print("不及格") end -- if-elseif-else语句 local grade = 75 if grade >= 90 then print("优秀") elseif grade >= 80 then print("良好") elseif grade >= 60 then print("及格") else print("不及格") end
在Lua中,只有nil和false被视为假值,其他所有值都是真值:
= 18 end -- 缓存复杂表达式 local function checkPermission(user, action) local isAdmin = user.role == "admin" local hasPermission = user.permissions[action] return isAdmin or hasPermission end -- 使用表查找代替if-elseif local gradeToText = { [90] = "优秀", [80] = "良好", [60] = "及格" } local function getGradeText(grade) for threshold, text in pairs(gradeToText) do if grade >= threshold then return text end end return "不及格" end
while循环在条件为真时重复执行代码块。适用于不确定循环次数的场景。
10 then break end print(count) end
while循环可能一次都不执行(初始条件为假时)。
repeat-until循环至少执行一次,直到条件为真时退出。这与while循环的行为相反。
5 -- 猜数字游戏示例 local secret = 42 local guess repeat print("请输入一个数字:") guess = tonumber(io.read()) if guess < secret then print("太小了") elseif guess > secret then print("太大了") end until guess == secret print("恭喜你猜对了!")
0 return num end local count = readPositiveNumber("请输入数量: ") print("数量: " .. count)
数值型for循环用于按指定步长遍历数值范围。这是Lua中最常用的循环结构之一。
数值型for循环的执行流程:
循环变量是局部变量,循环结束后不可访问。
泛型for循环用于遍历迭代器函数返回的值。Lua提供了内置的迭代器,也可以自定义迭代器。
ipairs用于遍历数组(从索引1开始的连续整数索引)。
pairs用于遍历表的所有键值对,包括数组部分和字典部分。
泛型for循环的语法:
for var_1, ..., var_n in explist do block end
等价于:
do
local _f, _s, _var = explist
while true do
local var_1, ..., var_n = _f(_s, _var)
_var = var_1
if _var == nil then break end
block
end
end
= 1 then return i, t[i] end end, t, #t + 1 end local arr = {10, 20, 30, 40, 50} for i, v in ripairs(arr) do print(i, v) end -- 输出: -- 5 50 -- 4 40 -- 3 30 -- 2 20 -- 1 10 -- 自定义迭代器:步长迭代 local function stepIterator(start, stop, step) return function(state, current) local nextValue = current + step if (step > 0 and nextValue <= stop) or (step < 0 and nextValue >= stop) then return nextValue end return nil end, nil, start - step end for i in stepIterator(0, 10, 2) do print(i) end -- 输出: 0 2 4 6 8 10
break用于跳出当前循环,goto用于跳转到指定的标签。
嵌套循环是指一个循环包含在另一个循环内部。理解嵌套循环的执行流程和优化策略很重要。
maxVal then maxVal = matrix[i][j] end end end return maxVal end print(findMax(matrix)) -- 9
= 90 then return "优秀" elseif average >= 80 then return "良好" elseif average >= 60 then return "及格" else return "不及格" end end -- 打印成绩单 print("=== 学生成绩单 ===") for i, student in ipairs(students) do local average = calculateAverage(student.scores) local grade = getGrade(average) print("\n" .. student.name) print("成绩: ", table.concat(student.scores, ", ")) print(string.format("平均分: %.2f", average)) print("等级: " .. grade) end -- 查找最高分学生 local function findTopStudent(students) local topStudent = nil local topAverage = 0 for i, student in ipairs(students) do local average = calculateAverage(student.scores) if average > topAverage then topAverage = average topStudent = student end end return topStudent, topAverage end local topStudent, topAverage = findTopStudent(students) print("\n最高分学生: " .. topStudent.name) print(string.format("平均分: %.2f", topAverage))
then 结尾,以 end 结束