Lua 入門學習筆記
本教程旨在幫助有編程基礎的學習者快速入門Lua編程語言。包括Lua中變量的聲明與使用,包括全局變量和局部變量的區別,以及nil類型的概念、數值型、字符串和函數的基本操作,包括16進制表示、科學計數法、字符串連接、函數聲明與調用等。此外,還介紹了table類型及其數字下標和字符串下標的用法,包括數組型table的聲明、賦值、長度獲取以及元素操作等。最后,介紹了Lua中的全局表、真和假的定義、分支判斷語句以及三種循環語句(for循環、while循環)
建議有編程基礎的同學使用這篇文章
一、編譯環境
在線體驗LuatOS
先直接寫一個輸出
print("hello world")
- 是
print
不是printf
- 語句后面沒有分號
二、變量聲明與作用域
-
默認全局變量:Lua 中直接賦值的變量默認是全局變量,跨文件可見。
-
局部變量:使用
local
關鍵字聲明,作用域限定在當前代碼塊、函數或文件內。 -
多變量賦值:
local a = 0 b, c = 1, 2 -- 同時聲明 b=1, c=2 d, e, f = 1, 2 -- c 未被賦值,值為 nil
- 規則:
- 左側變量數 > 右側值時,多余變量賦
nil
; - 右側值數 > 左側變量時,多余值被忽略。
- 左側變量數 > 右側值時,多余變量賦
- 規則:
三、數據類型系統
nil 類型
-
表示未初始化或顯式賦空值:沒有初始化的都為nil
-
相當于C語言中的NULL類型
local a print(undeclared_var) -- 輸出 nil
number 類型
在c語言里面數值有很多個類型,比如說int chair long float,但是在lua里面都統一叫做number數值型。
-
統一數值類型,支持多種表示方式:
- 十進制:
123
- 十六進制:
0x1F
(十進制 31) - 科學計數法:
2e10
(表示 20000000000)
- 十進制:
-
運算支持: lua也是支持加減乘除運算的,以及成冪符號,左移右移
print(10 ^ 5) -- 冪運算輸出 100000 print(1 << 3) -- 左移運算輸出 8 print(8 >> 1) -- 右移運算輸出 4
string 類型
字符串的聲明的話,跟c是差不多的。我們可以在lua里用雙引號來圈住一些字,表示一個字符串也可以用單引號圈出一個字,表示字符串單引號和雙引號都是可以的,而且支持轉義字符。
-
聲明方式:
-
單引號/雙引號:支持轉義符(如
\n
) -
長字符串:
[[多行文本]]
(保留原始格式,不轉義)a = "agcuiogogqWCU" b = 'uigdcfuwioge' c = [[dghoeuivfqwe qiowhc1266]]
-
-
操作:
另外在lua里面字符串的連接符號不是加號,是兩個點
c = a..b -- 連接運算符是兩個點 print(#"0123456789") -- 井號獲取長度,輸出 10
-
類型轉換:
s = tostring(10) -- 轉字符串 "10" n = tonumber("10") -- 轉數值 10 tonumber("abc") -- 轉換失敗返回 nil
-
顯示字符串長度:
a = "agcuiogogqWCU" print(#a) --在打印的前面加上'#'就可以顯示這個字符串的長度
四、函數定義與使用
函數聲明
-
一般的聲明方式:
function function_name(...)...-- body end
-
兩種等效方式:
function f(a, b) print(a, b) end f = function(a, b) print(a, b) end
參數與返回值
-
參數處理:
- 參數不足時自動補
nil
,多余參數被忽略。
- 參數不足時自動補
-
多返回值: 我們可以在函數里主動返回一些值,并且可以返回多個值
function f() return 1, 2 end i, j = f() -- i=1, j=2
-
默認返回值:無
return
時返回nil
。
五、表(table)數據結構
數組型 table
-
語法:
-
用大括號將成員括起來 ‘{ }’
-
用賦值 ‘=’ 賦值給變量
-
用逗號將成員分開 ‘,’
arr = {1,2,3,4,5}
-
-
核心特性:
- 下標從 1 開始,支持混合類型元素(也就是說可以存數字、字符串、函數、其他的table,但要注意用 ‘,’ 隔開)。
- 未定義元素值為
nil
。 - 動態擴展——對于table中沒有定義的位置可以直接賦值
- 自帶的接口
- insert(【table】,【位置】,【值】)
- remove(【table】,【位置】) ——有返回值,返回被移除的元素
-
操作示例:
arr = {1, "two", {subtable = true}} print(arr[5]) -- 輸出 nil arr[5] = "new" -- 動態擴展 print(#arr) -- 獲取長度 5 table.insert(arr, 2, "d") -- 插入元素 removed = table.remove(arr, 2) -- 移除元素并返回 "d"
哈希表型 table
-
字符串下標:
tbl = {key1 = 1,c = function()--.....end,["特殊符號"] = 123 --注意中括號以及"" } tbl["abc"] = "abc" print(tbl.key1) -- 輸出 1(這種輸出方式需要字符串下標符合變量命名規范) print(tbl["特殊符號"]) -- 輸出 123(注意是字符串,帶有"")
-
未聲明鍵值返回
nil
,支持動態添加鍵值對。
全局表 _G
-
存儲所有全局變量:
a = 1 print(_G["a"]) print(_G.a) -- 輸出 1 print(_G.table.insert) -- 輸出函數地址
-
實際上table也是一個全局變量,table這個全局變量它的類型就是table,它有一個下標叫做insert,同時table, 它因為是全局變量,所以它也在下劃線g全局表里面,就像這樣,我們打印出來發現它是一個table,而且呢,因為他也是一個table.
print(_G["table"]["insert"])
六、控制結構
邏輯運算
-
真假規則:僅
false
和nil
為假,其他值(包括 0)為真。a = true b = false print(1 > 2) print(1 < 2) print(1 <= 2) print(1 >= 2) print(1 == 2) print(1 ~= 2)
注意:在lua中不等于是用 " ~=" 表示的,不是用 “!=” 表示的
短路求值:
print(nil or 0) -- 輸出 0(返回第一個真值) print(true and "yes") -- 輸出 "yes"(返回第二個操作數)
-
and(與) or(或) 和 not(非)
a = true b = false print(a and b) print(a or b) print(not a)
注意:
-
在lua里有個特殊的規定,在lua里面只有false和nil代表假,其他都是真c語言里面零也代表假,但是在lua里面數字0是代表真的,因為他不是nil或者false
-
Lua里面的end or和not返回的并不是完全是false和true, lua里會直接返回a或者b的值
-
我們可以用and和or來實現短路求值
a = nil b = 0 print(a and b) print(a or b) print(not a)
運行結果:
-
分支判斷
-
語法:
if 【condition】 then-- code elseif 【condition2】 then-- code else-- code end
-
注意:
- elseif中間沒有空格
- 條件后面有
then
- 就像上面提到的0也是代表真
循環結構
-
for 循環:
for i = 1, 10 do -- 倒序循環if i == 5 then break end end
注意:
-
循環定義了一個變量,然后給變量一個初值,再給變量定義一個結束值,下面是執行的代碼塊,這個變量是可以直接使用的。當然這個變量出了這個代碼塊之后,就沒有意義了。
-
我們還可以再加一個參數,這個參數叫做步長,就是每一次循環初值
i
的變化的值 -
循環里面
i
在運行圖中是不能手動更改的。如果你修改了,他會默認悄悄給你在這邊新建一個變量,它新建了一個臨時變量,叫做i
,你后面調用的時候會用到i
,這一點和c不太一樣,它的循環是不能更改的。for i = 10, 1, -1 do -- 倒序循環if i == 5 then break end end
for i=10,i,-1 doprint(i)local i=1 -- 新建一個臨時變量--.... end
-
-
while 循環:
n = 10 while n > 1 don = n - 1 -- 必須顯式修改循環變量if n == 5 then break end end
注意:lua不支持自減操作如
n--
、n -= 1
這些
七、字符串高級特性
-
二進制安全:支持存儲空字符(
0x00
):s = string.char(0x30, 0x31, 0x32, 0x33, 0x00) print(#s) -- 輸出 5(包含空字符)
-
索引從 1 開始:
second = string.sub(s, 2, 2) print(string.byte(second)) -- 輸出 49(ASCII 碼值)
八、類型轉換與數值表示
操作 | 成功返回值 | 失敗返回值 |
---|---|---|
tonumber("123") | 123 | nil |
tonumber("0x1F") | 31 | nil |
tostring(123) | “123” | - |
tostring(nil) | “nil” | - |
九、編程實踐要點
- 變量作用域:優先使用
local
聲明局部變量。 - 表操作:注意數組下標從 1 開始,
#
僅統計連續數字下標長度。 - 字符串處理:使用
..
連接,#
獲取字節長度。 - 函數設計:支持多返回值,參數不足自動補
nil
。 - 全局變量管理:通過
_G
表訪問,避免污染全局命名空間。
進一步學習建議:
- 參考 Lua 5.3 官方手冊
- 搜索 “Lua 5.3 參考手冊” 查看完整函數庫(如數學庫、協程等)。
后面我會整理進階部分的筆記,之后會把筆記鏈接粘貼到這里。