Lua 是輕量級嵌入式腳本語言,廣泛用於遊戲開發、配置系統、自動化腳本。本文系統整理語法核心:註釋、控制流、賦值、運算符、關鍵字、八大類型、表、函數、面向對象模擬、協程基礎,適合有 C/Java 基礎開發者快速上手。
-- 註釋內容--[[ 註釋內容 --]](支持嵌套 --[=[ [=[ ]=] ]=])-- if-elseif-else if cond then ... elseif cond then ... else ... end -- while while cond do ... end -- repeat-until (至少執行一次) repeat ... until cond -- 數值 for for var = start, stop, step do ... end -- step 默認 1 -- 泛型 for (遍歷表/迭代器) for k, v in pairs(t) do ... end for i, v in ipairs(arr) do ... end
break 僅能跳出最內層循環,無 continue(5.2+ 可用 goto 模擬)。
a, b, c = 1, 2, 3 -- 多賦值 a, b = b, a -- 交換變量 local x, y = 10, 20 -- 局部變量(默認全局) x = x or default_val -- 預設值模式
^(冪)not -(一元)* /+ -..(字符串連接)< > <= >= == ~=andorfalse 和 nil 為假,0、空字符串、空表均為真。a and b:a 假返回 a,否則返回 b。a or b:a 真返回 a,否則返回 b。x = a and b or c(需 b 非假)。| 類型 | 說明 | 示例 |
|---|---|---|
| nil | 空值,未初始化變量默認值 | print(type(nil)) --> "nil" |
| boolean | true/false | |
| number | 雙精度浮點(Lua 5.3+ 有整數子類型) | 4, 0.4, 4.57e-3 |
| string | 不可變字節序列,可含 '\0' | "abc", [[多行]] |
| table | 關聯數組,鍵值任意類型(除 nil) | {key=val, [1]=2} |
| function | 第一類值,可賦值、傳參、返回 | function() end |
| userdata | 宿主 C 數據(結構體、指針)封裝 | C API 創建 |
| thread | 協程,非 OS 線程 | coroutine.create |
-- 構造
local t = { 10, 20, key = "val", [3] = 30 }
t.newKey = "new" -- 動態添加
t[1] = nil -- 刪除
-- 遍歷
for k, v in pairs(t) do print(k, v) end -- 所有鍵值
for i, v in ipairs(t) do print(i, v) end -- 連續整數鍵 1..#t
-- 作為數組
print(#t) -- 長度運算符(連續整數鍵邊界)
-- 定義
function add(a, b) return a + b end
local add = function(a, b) return a + b end -- 匿名函數賦值
-- 可變參數
function sum(a, b, ...)
local args = {...} -- 5.1 用 arg 表,5.2+ 直接 ...
local s = a + b
for _, v in ipairs(args) do s = s + v end
return s
end
-- 多返回值
function swap(a, b) return b, a end
x, y = swap(1, 2) -- x=2, y=1
-- 類表
local Account = { balance = 0 }
function Account:deposit(v) self.balance = self.balance + v end
function Account:withdraw(v) self.balance = self.balance - v end
-- 創建實例(原型繼承)
local a = { balance = 100 }
setmetatable(a, { __index = Account })
a:deposit(50) -- 等價 Account.deposit(a, 50)
-- 殘元方法
mt.__add = function(a,b) return a.value + b.value end
co = coroutine.create(function()
for i=1,3 do print("co", i); coroutine.yield() end
end)
coroutine.resume(co) -- 啟動/恢復
coroutine.status(co) -- "suspended"/"dead"
coroutine.wrap -- 返回函數封裝
string:sub, find, match, gsub, formattable:insert, remove, sort, concat, unpackmath:random, floor, ceil, min, maxos:time, date, clock, getenv, executeio:open, read, write, lines, close