Lua 是一門強(qiáng)大谭贪、快速、輕量的嵌入式腳本語言锦担,那么我們?nèi)绾尾拍軌蚩焖賹W(xué)習(xí)和掌握 Lua 語言呢俭识?在這我將分享一下我的 Lua 快速入門經(jīng)驗,希望對大家有所幫助洞渔。
Lua 安裝
Lua 的安裝過程可以參考 Lua 官網(wǎng) 或云風(fēng)翻譯的 Lua 5.3 參考手冊套媚。
在 Mac OS 上安裝
- 從 Lua 官網(wǎng)下載 Lua 最新的源碼,然后解壓磁椒。
- 打開終端堤瘤,并 cd 到解壓后的 Lua 源碼目錄
lua-5.3.2/
。 - 在終端中輸入
make macosx install
構(gòu)建并安裝 Lua浆熔。 - 在終端中輸入
lua -v
查看 Lua 是否已經(jīng)安裝完成本辐。
PS:如果你沒有安裝 Xcode 和命令行工具是不能使用 make 命令的。
在 Windows 上安裝
下載 luaforwindows 并安裝,這樣 lua 的開發(fā)環(huán)境就搭建好了慎皱,安裝后可以直接使用 SciTE IDE 來進(jìn)行 lua 代碼的編寫和運(yùn)行环葵。
Lua 編輯器的選擇
在這里介紹一下怎么使用 Sublime Text 來編寫和運(yùn)行 Lua 代碼,當(dāng)然你也可以使用其他文本編輯器或者 IDE 來編寫和運(yùn)行 Lua 代碼宝冕,例如在 Windows 上你可以直接使用上面所說的 SciTE。
下載并安裝 Sublime Text邓萨。
-
打開 Sublime Text地梨,點擊菜單欄中的 Tools -> Build System -> New Build System。在新建的 untitled.sublime-build 文件中輸入以下代碼缔恳,并把其中的
/usr/local/bin/lua
修改為你安裝 Lua 后可執(zhí)行文件 lua 的路徑(終端 lua 命令其實執(zhí)行的也是這個文件宝剖,在 Mac OS 系統(tǒng)上為/usr/local/bin/lua
)。最后 ctrl + s 將文件保存為 lua.sublime-build歉甚,保存位置默認(rèn)即可万细。你可以在/Users/gui/Library/Application Support/Sublime Text 2/Packages/User/
目錄下找個你保存的 lua.sublime-build 文件。
{
"cmd":["/usr/local/bin/lua", "$file"],
"file_regex":"^(...*?):([0-9]*):?([0-9]*)",
"selector":"source.lua"
}
- 在 Sublime Text 中新建一個文件纸泄,輸入
print("hello world")
并保存為 test.lua赖钞,然后 ctrl + b 運(yùn)行,這個時候我們就能在 Sublime Text 中的控制臺看到輸出 "hello world"聘裁。
Lua 快速入門資料
- Lua 官方參考手冊 或云風(fēng)翻譯的 Lua 5.3 參考手冊雪营。
- 書籍《Lua 程序設(shè)計》。
Lua 參考手冊非常適合作為快速入門的閱讀資料衡便,對 Lua 的語法等有疑惑時查看 Lua 參考手冊也能快速解惑献起。《Lua 程序設(shè)計》除了介紹 Lua 的語法等基礎(chǔ)知識外镣陕,還會介紹一些 Lua 高級的用法谴餐,例如:面向?qū)ο缶幊蹋ㄔ?Lua 中怎么實現(xiàn)類、繼承呆抑、多重繼承等)岂嗓,所以《Lua 程序設(shè)計》也是非常值得去購買的一本書籍。
PS:在學(xué)習(xí)的過程中理肺,建議對于不理解和有疑惑的地方參照資料自己動手編寫代碼并運(yùn)行查看輸出結(jié)果摄闸。
Lua 語法
這里主要簡單介紹一下 Lua 的語法和在使用過程中特別需要注意事項,同時對 Lua 和其他一些編程語言很不一樣的地方進(jìn)行說明妹萨。以下的部分內(nèi)容引用自:云風(fēng)翻譯的 Lua 5.3 參考手冊 和《Lua 程序設(shè)計》年枕。
打印
print (···)
接收任意數(shù)量的參數(shù),并將它們的值打印到 stdout乎完。 它用 tostring 函數(shù)將每個參數(shù)都轉(zhuǎn)換為字符串熏兄。 print 不用于做格式化輸出。僅作為看一下某個值的快捷方式。 多用于調(diào)試摩桶。 完整的對輸出的控制桥状,請使用 string.format 以及 io.write。
注釋
Lua 中使用 --
作為行注釋硝清,使用 --[[]]
作為塊注釋辅斟。
塊注釋的常見寫法如下,這樣只需要在塊注釋的最前面加上 “-” 即可取消整個塊注釋芦拿,非常實用的一個小技巧士飒。
-- 行注釋
--[[塊注釋]]
--[[
塊注釋常見技巧:只要在塊注釋的前面加上“-”即可取消注釋
--]]
值和類型
Lua 中有八種基本類型:nil、boolean蔗崎、number酵幕、string、function缓苛、userdata芳撒、
thread 和 table。
nil 和 false 都會導(dǎo)致條件判斷為假未桥;而其它任何值都表示為真笔刹。
表、函數(shù)钢属、線程徘熔、以及完全用戶數(shù)據(jù)在 Lua 中被稱為 對象:變量并不真的 持有 它們的值,而僅保存了對這些對象的 引用淆党。賦值酷师、參數(shù)傳遞、函數(shù)返回染乌,都是針對引用而不是針對值的操作山孔,這些操作均不會做任何形式的隱式拷貝。
Lua 是一門動態(tài)類型語言荷憋。這意味著變量沒有類型台颠;只有值才有類型。語言中不設(shè)類型定義勒庄。所有的值攜帶自己的類型串前。
Lua 中所有的值都是 一等公民。這意味著所有的值均可保存在變量中实蔽、當(dāng)作參數(shù)傳遞給其它函數(shù)荡碾、以及作為返回值。
Lua 中局装,函數(shù)可以保存在變量中坛吁、當(dāng)作參數(shù)傳遞給其它函數(shù)劳殖、以及作為返回值。
局部變量和全局變量
所有沒有顯式聲明為局部變量的變量名都被當(dāng)做全局變量拨脉。在編寫 Lua 代碼的時候如果不是全局變量一定記得添加 local哆姻。
b = 2 -- 全局變量 b
local a = 1 -- 局部變量 a
字符串
Lua 中字符串通常使用單引號或者雙引號來界定,但在某些特殊的情況下會用一對匹配的雙方括號來界定一個字母字符串玫膀,就像寫“塊注釋”那樣矛缨。這種寫法對于書寫那種含有程序代碼的字符串尤為有用。如果第一個字符是換行符帖旨,那么lua會忽略它劳景。
在兩個方括號間加上任意數(shù)量的等號,這樣字符串或者注釋只有遇到一個內(nèi)嵌有相同數(shù)量定好的雙右方括號時才會結(jié)束
page = [=[
<html>
<head>
<title>An html page</title>
</head>
<body>
<a >Lua</a>
</body>
<html>
--[[
a = "one string"
b = string.gsub(a, "one", "another")
print("a =", a)
print("b =", b)
--]]
]=]
print("-- print page string -- ")
print(page)
輸出結(jié)果如下圖:
ipairs 和 pairs
- ipairs 將迭代表中的鍵值對(
1,t[1]
) 碉就,(2,t[2]
), … 闷串,直到第一個空值瓮钥。注意:是從 1 開始迭代,而不是從 0 開始迭代烹吵。 - pairs 能迭代表中的所有鍵值對碉熄,而且迭代的順序是不保證的,每次執(zhí)行迭代的順序都可能不一樣肋拔。
ipairs 通常只用于迭代序列锈津,而 pairs 則可用于迭代所有的表。
local t = {}
t[0] = 0
t[1] = 1
t[2] = 2
t[4] = 4
t["x"] = "x"
t["y"] = "y"
print("------ ipairs ------")
for i,v in ipairs(t) do
print(i,v)
end
print("------ pairs ------")
for k,v in pairs(t) do
print(k,v)
end
輸出如下圖:
唯一的數(shù)據(jù)結(jié)構(gòu) table
表是 Lua 中唯一的數(shù)據(jù)結(jié)構(gòu)凉蜂,它可被用于表示普通數(shù)組琼梆、序列、符號表窿吩、集合茎杂、記錄、圖纫雁、樹等等煌往。對于記錄,Lua 使用域名作為索引轧邪。語言提供了 a.name
這樣的語法糖來替代a["name"]
這種寫法以方便記錄這種結(jié)構(gòu)的使用刽脖。
table 構(gòu)造式
- 列表風(fēng)格構(gòu)造式:
{”r“, "g", "b"}
- 記錄風(fēng)格構(gòu)造式:
{x = 10, y = 20}
- 通用風(fēng)格構(gòu)造式:
{[1] = "r", [2] = "g", [3] = "r"}
{["x"] = 10, ["y"] = 20}
函數(shù)
當(dāng)函數(shù)只有一個參數(shù)并且該參數(shù)是一個字符串或者 table 時,函數(shù)調(diào)用時的括號是可以省略的忌愚。
function f(t)
print(table.concat(t, ","))
end
f{1, 2, 3}
print "Hello World" --> print("Hello World")
print [=[a multi-line
message]=]
print(type{})
取長度操作符
如果 __len
元方法沒有給出曲管,表 t
的長度只在表是一個 序列 時有定義。序列指表的正數(shù)鍵集等于 {1..n} 菜循,其中 n 是一個非負(fù)整數(shù)翘地。在這種情況下申尤,n 是表的長度。注意這樣的表 {10, 20, nil, 40}
不是一個序列衙耕,因為它有鍵 4
卻沒有鍵 3
昧穿,因此,該表的正整數(shù)鍵集不等于 {1..n} 集合橙喘,故而就不存在 n时鸵。注意:一張表是否是一個序列和它的非數(shù)字鍵無關(guān)。
取長度操作符對于不是序列(有時也稱為數(shù)組厅瞎、線性表)的 table 來說是無意義的饰潜。
從下面的代碼的輸出很明顯可以看出:當(dāng) table 不是序列的時候,取長度操作符的結(jié)果是變動的和簸、無意義的彭雾。
-- #取長度操作符,table的長度是從1算起
local t1 = {}
t1[1] = 1
t1[2] = 2
print("t1", #t1) --> 2
-- #取長度操作符锁保,返回一個數(shù)組或線性表的最后一個索引值薯酝。
-- #取長度操作符對于不是數(shù)組或者線性表的table來說是無意義的。
local t2 = {}
t2[1] = 1
t2[2] = 2
t2[4] = 4
print("t2", #t2) --> 4
local t3 = {}
t3[1] = 1
t3[2] = 2
t3[5] = 5
print("t3", #t3) --> 2
local t4 = {}
t4[1] = 1
t4[2] = 2
t4[1000] = 1000
print("t4", #t4) --> 2
local t5 = {}
t5[1] = 1
t5[2] = 2
t5[3] = 3
t5[4] = 4
t5[7] = 7
t5[1000] = 1000
print("t5", #t5) --> 4
local t6 = {}
t6[1] = 1
t6[2] = 2
t6[3] = 3
t6[4] = 4
t6[7] = 7
t6[8] = 8
t6[1000] = 1000
print("t6", #t6) --> 8
字符串連接符
在 Lua 中爽柒,連接兩個字符串或者連接字符串和一個其他值使用字符串連接符 ..
吴菠。在使用過程中應(yīng)該在字符串連接符前面和后面都添加一個空格,例如:"str" .. 666
浩村。特別當(dāng)其中一個值是 number 時做葵,如果寫成 "str"..666
或 666.."str"
這樣,運(yùn)行時就會出錯:unexpected symbol near '..'
心墅。因為字符串連接符和數(shù)字之間沒有空格酿矢,Lua 就無法區(qū)分這是小數(shù)點還是字符串連接符了。所以在使用字符串連接符的時候怎燥,不要為了方便而省略空格棠涮。
本文出自 Eddy Wiki ,轉(zhuǎn)載請注明出處:http://eddy.wiki/lua-quick-start.html