🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

Lua 循环控制结构详解

一、循环类型概览

二、while 循环

基本语法

示例

三、repeat-until 循环

基本语法

特点

示例

四、for 循环(数值型)

基本语法

示例

五、泛型 for 循环

基本语法

常用迭代器

1. ipairs- 遍历数组部分

2. pairs- 遍历所有键值对

3. 文件行迭代

4. 字符串匹配迭代

六、循环控制语句

1. break- 跳出循环

2. Lua 没有 continue语句

七、高级循环技巧

1. 自定义迭代器

2. 多重赋值

3. 保护模式

八、性能考虑

九、常见陷阱

十、实用示例


img

Lua 循环控制结构详解

Lua 提供了多种循环结构,下面详细说明每种循环的语法、特性和使用示例。

一、循环类型概览

循环类型

描述

使用场景

while

条件循环

条件不明确时

repeat

直到型循环

至少执行一次

for

计数循环

已知迭代次数

泛型for

迭代器循环

遍历表、文件等

二、while 循环

基本语法

while condition do
    -- 循环体
end

示例

-- 基础示例
local i = 1
while i <= 5 do
    print("计数: " .. i)
    i = i + 1
end

-- 复杂条件
local x = 10
while x > 0 and x % 2 == 0 do
    print("偶数: " .. x)
    x = x - 2
end

-- 无限循环(需要有退出机制)
local running = true
while running do
    print("处理中...")
    -- 某个条件改变 running 为 false
    if some_condition then
        running = false
    end
end

三、repeat-until 循环

基本语法

repeat
    -- 循环体
until condition  -- 条件为真时退出

特点

  • 至少执行一次

  • 条件在循环体之后检查

示例

-- 基础示例
local i = 1
repeat
    print("值: " .. i)
    i = i + 1
until i > 5

-- 用户输入验证
local answer
repeat
    print("请输入 yes 或 no:")
    answer = io.read()
until answer == "yes" or answer == "no"

-- 计算直到满足条件
local n = 1
repeat
    n = n * 2
    print("n = " .. n)
until n > 100

四、for 循环(数值型)

基本语法

for var = start, end, step do
    -- 循环体
end
  • step默认为 1,可为正数或负数

  • 循环变量 var是局部变量

示例

-- 正序递增
for i = 1, 5 do
    print("i = " .. i)
end
-- 输出: 1 2 3 4 5

-- 指定步长
for i = 1, 10, 2 do
    print("奇数: " .. i)
end
-- 输出: 1 3 5 7 9

-- 倒序
for i = 5, 1, -1 do
    print("倒计时: " .. i)
end
-- 输出: 5 4 3 2 1

-- 浮点数(不推荐,通常用整数)
for i = 0.0, 1.0, 0.2 do
    print(string.format("i = %.1f", i))
end

-- 嵌套循环
for i = 1, 3 do
    for j = 1, 3 do
        print(i .. "x" .. j .. " = " .. i*j)
    end
end

五、泛型 for 循环

基本语法

for var_list in expression_list do
    -- 循环体
end

常用迭代器

1. ipairs- 遍历数组部分
local fruits = {"apple", "banana", "cherry"}

for i, fruit in ipairs(fruits) do
    print(i .. ": " .. fruit)
end
2. pairs- 遍历所有键值对
local person = {
    name = "Alice",
    age = 25,
    city = "Beijing"
}

for key, value in pairs(person) do
    print(key .. ": " .. tostring(value))
end
3. 文件行迭代
-- 遍历文件每一行
for line in io.lines("data.txt") do
    print("行: " .. line)
end
4. 字符串匹配迭代
local text = "hello world from lua"

for word in string.gmatch(text, "%a+") do
    print("单词: " .. word)
end

六、循环控制语句

1. break- 跳出循环

-- 在 while 中
local i = 1
while true do
    if i > 5 then
        break
    end
    print(i)
    i = i + 1
end

-- 在 for 中
for i = 1, 10 do
    if i == 6 then
        break
    end
    print(i)
end

2. Lua 没有 continue语句

-- 模拟 continue
for i = 1, 10 do
    if i % 2 == 0 then
        goto skip_rest  -- 使用 goto 模拟
    end
    
    print("奇数: " .. i)
    
    ::skip_rest::
end

-- 使用 if-else 替代
for i = 1, 10 do
    if i % 2 ~= 0 then
        print("奇数: " .. i)
    end
end

七、高级循环技巧

1. 自定义迭代器

-- 创建自定义迭代器
function squares(limit)
    local i = 0
    return function()
        i = i + 1
        if i <= limit then
            return i, i * i
        end
    end
end

-- 使用自定义迭代器
for n, square in squares(5) do
    print(n .. " 的平方是 " .. square)
end

2. 多重赋值

-- 同时遍历多个表
local names = {"Alice", "Bob", "Charlie"}
local ages = {25, 30, 35}

for i, name in ipairs(names) do
    print(name .. " 年龄 " .. ages[i])
end

3. 保护模式

-- 在循环中处理异常
local data = {1, 2, "three", 4, 5}

for i, value in ipairs(data) do
    local success, result = pcall(function()
        return value * 2
    end)
    
    if success then
        print("结果: " .. result)
    else
        print("错误: 索引 " .. i .. " 的值无法计算")
    end
end

八、性能考虑

-- 避免在循环中创建表
-- 不推荐
for i = 1, 10000 do
    local t = {}  -- 每次循环都创建新表
    -- 操作
end

-- 推荐
local t = {}
for i = 1, 10000 do
    -- 复用表
    t = {}  -- 或 table.clear(t)
    -- 操作
end

-- 预计算循环条件
-- 不推荐
for i = 1, #some_table do
    -- 循环体
end

-- 推荐(当表大小不变时)
local size = #some_table
for i = 1, size do
    -- 循环体
end

九、常见陷阱

-- 1. 不要在循环中修改循环变量(for 循环)
for i = 1, 10 do
    i = i + 1  -- 无效,每次迭代会重置
    print(i)
end

-- 2. pairs 遍历顺序不确定
local t = {a=1, b=2, c=3, d=4}
for k, v in pairs(t) do
    print(k, v)  -- 顺序可能变化
end

-- 3. 无限循环
-- while true do
--     print("无限循环")
-- end
-- 需要有 break 条件

-- 4. 闭包中的循环变量
local funcs = {}
for i = 1, 5 do
    funcs[i] = function()
        return i  -- 所有函数都引用同一个 i
    end
end

-- 修正
for i = 1, 5 do
    local j = i  -- 创建局部副本
    funcs[i] = function()
        return j
    end
end

十、实用示例

-- 1. 斐波那契数列
local a, b = 0, 1
for i = 1, 10 do
    print(a)
    a, b = b, a + b
end

-- 2. 过滤数组
local numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
local evens = {}

for _, num in ipairs(numbers) do
    if num % 2 == 0 then
        table.insert(evens, num)
    end
end

-- 3. 查找元素
local found = false
local target = 5
local data = {2, 4, 6, 8, 10}

for i, v in ipairs(data) do
    if v == target then
        print("找到 " .. target .. " 在位置 " .. i)
        found = true
        break
    end
end

if not found then
    print("未找到 " .. target)
end

-- 4. 统计字符频率
local text = "hello lua world"
local freq = {}

for c in text:gmatch(".") do
    freq[c] = (freq[c] or 0) + 1
end

for char, count in pairs(freq) do
    print(char .. ": " .. count)
end

这些是 Lua 中循环控制结构的主要用法。根据具体需求选择合适的循环类型,并注意避免常见的陷阱。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐