您的位置:首页 > 科技 > IT业 > 百度电脑版网页版_冯耀宗seo视频教程_济南公司网站推广优化最大的_天津网站优化软件

百度电脑版网页版_冯耀宗seo视频教程_济南公司网站推广优化最大的_天津网站优化软件

2025/4/18 13:27:18 来源:https://blog.csdn.net/qq_45657541/article/details/147097845  浏览:    关键词:百度电脑版网页版_冯耀宗seo视频教程_济南公司网站推广优化最大的_天津网站优化软件
百度电脑版网页版_冯耀宗seo视频教程_济南公司网站推广优化最大的_天津网站优化软件

在 Lua 中,forwhile 是两种核心的循环结构,用于实现重复执行逻辑。以下是它们的详细用法、进阶技巧及注意事项:


在 Lua 中,`for` 和 `while` 是两种核心的循环结构的详细用法—目录

  • 一、`for` 循环
    • 1. 数值 `for` 循环
      • 基础语法:
      • 关键特性:
      • 常见问题:
    • 2. 泛型 `for` 循环
      • 基础语法:
      • 关键特性:
  • 二、`while` 循环
    • 基础语法:
    • 关键特性:
  • 三、进阶用法
    • 1. 嵌套循环与标签控制
    • 2. 循环控制命令
    • 3. 性能优化技巧
  • 四、特殊场景与模式
    • 1. 遍历复杂数据结构
    • 2. 模拟 C 风格 `for` 循环
    • 3. 事件循环与协程
  • 五、注意事项与最佳实践
    • 1. 避免死循环
    • 2. 变量作用域
    • 3. 性能对比
  • 六、实战示例
    • 示例1:猜数字游戏
    • 示例2:批量文件处理
    • 示例3:生产者-消费者模型


一、for 循环

1. 数值 for 循环

基础语法:

-- 格式:for var = start, end [, step] do ... end
for i = 1, 5 doprint(i)  -- 输出 1 到 5
endfor i = 10, 1, -2 doprint(i)  -- 输出 10,8,6,4,2
end

关键特性:

• 范围表达式:startendstep 均为表达式,运行时计算。
• 隐式步长:默认步长为 1
• 浮点数支持:

for i = 0, 1, 0.2 doprint(i)  -- 输出 0, 0.2, 0.4, 0.6, 0.8, 1.0
end

常见问题:

• 浮点精度问题:

for i = 0, 0.1, 0.1 do print(i) end  -- 可能因精度丢失导致死循环

解决:改用整数步长后缩放:

for i = 0, 1, 0.1 do ... end  -- 改为整数逻辑

2. 泛型 for 循环

基础语法:

-- 格式:for k, v in pairs(t) do ... end
local t = {a=1, b=2, c=3}
for key, value in pairs(t) doprint(key, value)  -- 遍历表的所有键值对
endfor index, value in ipairs({"a", "b", "c"}) doprint(index, value)  -- 遍历数组部分(1-based)
end

关键特性:

• 迭代器协议:pairs(遍历所有键值)和 ipairs(遍历数组部分)是内置迭代器。
• 自定义迭代器:

-- 生成斐波那契数列的迭代器
function fib()local a, b = 0, 1return function()a, b = b, a + breturn aend
endfor num in fib() doif num > 100 then break endprint(num)
end

二、while 循环

基础语法:

-- 格式:while condition do ... end
local i = 1
while i <= 5 doprint(i)i = i + 1  -- 必须修改条件相关变量,否则死循环
end

关键特性:

• 条件前置:每次循环开始前检查条件。
• 无限循环:

while true do-- 需要主动 break 或 return 退出
end

三、进阶用法

1. 嵌套循环与标签控制

::outer_loop::
for i = 1, 3 dofor j = 1, 3 doif i == 2 and j == 2 thengoto outer_loop  -- 跳出外层循环endprint("i:", i, "j:", j)end
end

2. 循环控制命令

break:立即退出当前最内层循环。
continue:跳过当前迭代(Lua 5.3+ 支持):

for i = 1, 5 doif i == 3 then continue endif i == 5 then break endprint("Current value:", i)
end
-- 输出:1,2,4

3. 性能优化技巧

• 减少循环内计算:

-- 不推荐:每次循环都计算 len
for i = 1, #table dolocal len = #table  -- 重复计算print(i, len)
end-- 推荐:预计算
local len = #table
for i = 1, len doprint(i, len)
end

• 使用泛型 for 替代手动索引:

-- 低效写法
local i = 1
while my_table[i] doprint(my_table[i])i = i + 1
end-- 高效写法
for _, value in ipairs(my_table) doprint(value)
end

四、特殊场景与模式

1. 遍历复杂数据结构

-- 遍历嵌套表(深度优先)
local function deep_traverse(t)for k, v in pairs(t) doif type(v) == "table" thendeep_traverse(v)elseprint(k, v)endend
end

2. 模拟 C 风格 for 循环

-- 自定义范围迭代器
function range(start, stop, step)step = step or 1local current = startreturn function()if (step > 0 and current <= stop) or (step < 0 and current >= stop) thenlocal value = currentcurrent = current + stepreturn valueendend
endfor i in range(1, 5, 1) do print(i) end  -- 1,2,3,4,5

3. 事件循环与协程

-- 使用协程实现非阻塞循环
local function task()for i = 1, 5 doprint("Coroutine:", i)coroutine.yield()  -- 主动让出执行权end
endlocal co = coroutine.create(task)
coroutine.resume(co)  -- 启动协程
coroutine.resume(co)  -- 恢复执行

五、注意事项与最佳实践

1. 避免死循环

• 确保循环条件最终会变为 false

-- 错误示例:缺少变量递增
local i = 1
while i <= 5 doprint(i)-- i 未更新 → 死循环
end

2. 变量作用域

for 循环变量是块级作用域(Lua 5.3+):

for i = 1, 3 dolocal i = "inner"  -- 局部变量,不影响外层循环print(i)  -- 输出 "inner"
end

3. 性能对比

场景推荐结构原因
遍历数组ipairs效率高,自动处理 nil
遍历字典pairs遍历所有键值对
已知迭代次数数值 for更直观
条件不确定的重复执行while/repeat灵活控制退出条件

六、实战示例

示例1:猜数字游戏

math.randomseed(os.time())
local secret = math.random(1, 100)
print("猜一个 1~100 的数字:")while true dolocal guess = tonumber(io.read())if not guess then break end  -- 输入非数字退出if guess < secret thenprint("太小了!")elseif guess > secret thenprint("太大了!")elseprint("恭喜猜中!")breakend
end

示例2:批量文件处理

local files = {"a.txt", "b.txt", "c.txt"}
for _, filename in ipairs(files) dolocal file = io.open(filename, "r")if file thenprint("处理文件:", filename)file:close()elseprint("文件不存在:", filename)end
end

示例3:生产者-消费者模型

local queue = {}
local function producer()for i = 1, 5 dotable.insert(queue, "item"..i)print("生产:", i)end
endlocal function consumer()while true doif #queue > 0 thenlocal item = table.remove(queue, 1)print("消费:", item)elsebreakendend
endproducer()
consumer()

通过灵活组合 forwhile 循环,并结合 Lua 的迭代器和协程特性,可以实现高效且易读的逻辑控制。对于复杂场景,建议优先使用泛型 for 和表驱动模式,减少手动循环控制带来的复杂性。


版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com