在 Lua 中,`for` 和 `while` 是兩種核心的循環結構的詳細用法

在 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 和表驅動模式,減少手動循環控制帶來的復雜性。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77406.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77406.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77406.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

A2DP(Advanced Audio Distribution Profile)是藍牙協議棧中用于音頻傳輸的一個標準化協議

A2DP&#xff08;Advanced Audio Distribution Profile&#xff09;是藍牙協議棧中用于音頻傳輸的一個標準化協議&#xff0c;主要用于高質量音頻流的無線傳輸。以下是A2DP協議的詳細信息&#xff1a; 定義 A2DP協議允許音源設備&#xff08;Source&#xff0c;簡稱SRC&#…

STM32_USB

概述 本文是使用HAL庫的USB驅動 因為官方cubeMX生成的hal庫做組合設備時過于繁瑣 所以這里使用某大神的插件,可以集成在cubeMX里自動生成組合設備 有小bug會覆蓋生成文件里自己寫的內容,所以生成一次后注意保存 插件安裝 下載地址 https://github.com/alambe94/I-CUBE-USBD-Com…

【文獻閱讀】Capabilities of Gemini Models in Medicine

? Google DeepMind Google Research 發表于 2024-04-29 相關鏈接&#xff1a; 數據集&#xff1a;https://huggingface.co/datasets/katielink/med-gemini-medqa-relabeled 注&#xff1a;長EHR是長的電子健康記錄&#xff08;Electronic Health Record&#xff09; 未開…

網絡安全小知識課堂(最終完結版)

網絡安全入門 &#xff1a;從 “小白” 到 “守護者” 的蛻變之旅 寫在完結之際 歷經 13 篇的深度探索&#xff0c;我們從 DDoS 攻擊的 “流量洪水” 一路闖關到 HTTPS 的 “加密堡壘”&#xff0c;揭開了網絡安全世界的層層面紗。感謝每一位讀者的陪伴與互動&#xff0c;你們…

Php laravel 留言板 curd 實戰

1. 項目創建 首先我們用composer創建項目 &#xff0c; composer會根據當前的php版本 幫我們選擇支持的最高版本 composer create-project --prefer-dist laravel/laravel myblog laravel新版本比較激進 &#xff0c;需要最低 php7 支持 2. 項目配置 數據庫配置 &#xff0c…

HTTP 壓力測試工具autocannon(AI)

簡介 autocannon 是一款基于 Node.js 的高性能 HTTP 壓力測試工具&#xff0c;適用于評估 Web 服務的并發處理能力和性能瓶頸。 一、工具特點 高性能?&#xff1a;利用 Node.js 異步非阻塞機制模擬高并發請求?。?實時監控?&#xff1a;測試過程中動態展示請求統計和性能…

LVM 擴容詳解

目錄 一、LVM擴容 1. 查看磁盤分區情況&#xff1a; 2. 查看pv、vg、lv 情況 3. 將新硬盤分區初始化 4. 將初始化后的分區添加到VG中 5. 查看邏輯卷的設備路徑 6. VG分配給lv 二、擴展文件系統 1.確認文件系統類型 三、檢驗 一、LVM擴容 1. 查看磁盤分區情況&#xff1a; …

每日一題(小白)數組娛樂篇21

由于題意可知我們是要將對應的數字轉換為英文&#xff0c;我們要考慮兩點一個是進制的轉換&#xff0c;也就是類似于我們的十進制一到9就多一位&#xff0c;這里的進制就是Z進制也就是27進制一旦到26下一位則進位&#xff1b;另一方面要考慮數字的轉換也就是1~26對應A~Z。解決上…

python爬蟲:喜馬拉雅案例(破解sign值)

聲明&#xff1a; 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 根據上一篇文章&#xff0c;我們破解了本網站的&#xff0c;手機號和密碼驗證&#x…

深入探討:Spring 如何接入 DeepSeek?

?在當今數字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技術的迅猛發展深刻地改變著各個領域的技術格局。Java 作為一種廣泛應用于企業級開發的編程語言&#xff0c;其生態系統也在不斷演進以適應 AI 技術的融入。Spring 框架&#xff0c;作為 Java 生態中的中流…

VSCode運行,各類操作緩慢,如何清理

VSCode寫代碼&#xff0c;隨著項目逐步進展&#xff0c;代碼量在增加&#xff0c;依賴的第三方頭文件也在增加&#xff0c; 先是發現代碼提示的速度變慢&#xff0c; 后來格式化代碼速度太慢 然后c/c代碼的語法檢查有時候壓根就失敗&#xff0c;來個錯誤提示 還有source contro…

Elasticsearch:加快 HNSW 圖的合并速度

作者&#xff1a;來自 Elastic Thomas Veasey 及 Mayya Sharipova 過去&#xff0c;我們曾討論過搜索多個 HNSW 圖時所面臨的一些挑戰&#xff0c;以及我們是如何緩解這些問題的。當時&#xff0c;我們也提到了一些計劃中的改進措施。本文正是這項工作的成果匯總。 你可能會問…

人事|人事管理系統|基于Springboot+vue的人事管理系統設計與實現(源碼+數據庫+文檔)

人事管理系統 目錄 基于Springboot的人事管理系統設計與實現 一、前言 二、系統功能設計 三、系統實現 1、管理員登錄 2、員工管理 3、公告信息管理 4、公告類型管理 5、培訓管理 6、培訓類型管理 四、數據庫設計 1、實體ER圖 五、核心代碼 六、論文參考 七、最新…

2.4GHz射頻前端噪聲系數優化架構

2.4GHz射頻前端電路架構由信號處理鏈路、硬件模塊及性能規范構成&#xff0c;其系統組成與參數要求如下&#xff1a; 一、信號發射鏈路? 數字基帶信號通過DAC轉換為模擬信號? 調制電路將信號加載至本地振蕩器生成的2.4GHz載波? 功率放大器將信號強度提升至20-25dBm范圍? …

開源 LLM 應用開發平臺 Dify 全棧部署指南(Docker Compose 方案)

開源 LLM 應用開發平臺 Dify 全棧部署指南&#xff08;Docker Compose 方案&#xff09; 一、部署環境要求與前置檢查 1.1 硬件最低配置 組件要求CPU雙核及以上內存4GB 及以上磁盤空間20GB 可用空間 1.2 系統兼容性驗證 ? 官方支持系統&#xff1a; Ubuntu 20.04/22.04 L…

Trae AI 保姆級教程:從安裝到調試全流程指南

Trae AI 保姆級教程&#xff1a;從安裝到調試全流程指南 Trae AI 是字節跳動推出的一款 AI 原生集成開發環境(IDE)&#xff0c;專為中文開發者設計&#xff0c;集成了 Claude 3.5 和 GPT-4o 等先進 AI 模型&#xff0c;支持通過自然語言交互實現代碼生成、項目構建與調試。本教…

博物館小程序怎么做?從0到1打造數字化文化窗口

博物館小程序怎么做&#xff1f;從0到1打造數字化文化窗口 一、行業痛點&#xff1a;傳統博物館的數字化困局 在數字化浪潮下&#xff0c;傳統博物館普遍面臨三大挑戰&#xff1a; ??客流受限??&#xff1a;線下接待能力有限&#xff0c;難以觸達更廣泛人群 ??互動單一…

基于 Netty 框架的 Java TCP 服務器端實現,用于啟動一個 TCP 服務器來處理客戶端的連接和數據傳輸

代碼&#xff1a; package com.example.tpson_tcp;import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; imp…

深入解析原生鴻蒙中的 RN 日志系統:從入門到精通!

全文目錄&#xff1a; 開篇語&#x1f4d6; 目錄&#x1f3af; 前言&#xff1a;鴻蒙日志系統究竟有多重要&#xff1f;&#x1f6e0;? 鴻蒙 RN 日志系統的基礎結構&#x1f4dc; 1. 日志的作用?? 2. 日志分類 &#x1f527; 如何在鴻蒙 RN 中使用日志系統&#x1f58b;? 1…

算法訓練營Day01(二分 雙指針)

704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 關于二分查找 最重要的是要處理好邊界問題&#xff0c;每次寫完邊界可以帶入特殊值進行測試確定區間的不變量是什么&#xff1f;比如區間的左閉右閉&#xff0c;和左閉右開&#xff0c;每次二分完的新區間&#xff0c;一…