Lua 是一門強(qiáng)大、快速、輕量的嵌入式腳本語言,那么我們?nèi)绾尾拍軌蚩焖賹W(xué)習(xí)和掌握 Lua 語言呢?在這我將分享一下我的 Lua 快速入門經(jīng)驗(yàn),希望對(duì)大家有所幫助。
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,點(diǎn)擊菜單欄中的 Tools -> Build System -> New Build System。在新建的 untitled.sublime-build 文件中輸入以下代碼,并把其中的
/usr/local/bin/lua
修改為你安裝 Lua 后可執(zhí)行文件 lua 的路徑(終端 lua 命令其實(shí)執(zhí)行的也是這個(gè)文件,在 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/
目錄下找個(gè)你保存的 lua.sublime-build 文件。
{
"cmd":["/usr/local/bin/lua", "$file"],
"file_regex":"^(...*?):([0-9]*):?([0-9]*)",
"selector":"source.lua"
}
- 在 Sublime Text 中新建一個(gè)文件,輸入
print("hello world")
并保存為 test.lua,然后 ctrl + b 運(yùn)行,這個(gè)時(shí)候我們就能在 Sublime Text 中的控制臺(tái)看到輸出 "hello world"。
Lua 快速入門資料
- Lua 官方參考手冊 或云風(fēng)翻譯的 Lua 5.3 參考手冊。
- 書籍《Lua 程序設(shè)計(jì)》。
Lua 參考手冊非常適合作為快速入門的閱讀資料,對(duì) Lua 的語法等有疑惑時(shí)查看 Lua 參考手冊也能快速解惑。《Lua 程序設(shè)計(jì)》除了介紹 Lua 的語法等基礎(chǔ)知識(shí)外,還會(huì)介紹一些 Lua 高級(jí)的用法,例如:面向?qū)ο缶幊蹋ㄔ?Lua 中怎么實(shí)現(xiàn)類、繼承、多重繼承等),所以《Lua 程序設(shè)計(jì)》也是非常值得去購買的一本書籍。
PS:在學(xué)習(xí)的過程中,建議對(duì)于不理解和有疑惑的地方參照資料自己動(dòng)手編寫代碼并運(yùn)行查看輸出結(jié)果。
Lua 語法
這里主要簡單介紹一下 Lua 的語法和在使用過程中特別需要注意事項(xiàng),同時(shí)對(duì) Lua 和其他一些編程語言很不一樣的地方進(jìn)行說明。以下的部分內(nèi)容引用自:云風(fēng)翻譯的 Lua 5.3 參考手冊 和《Lua 程序設(shè)計(jì)》。
打印
print (···)
接收任意數(shù)量的參數(shù),并將它們的值打印到 stdout。 它用 tostring 函數(shù)將每個(gè)參數(shù)都轉(zhuǎn)換為字符串。 print 不用于做格式化輸出。僅作為看一下某個(gè)值的快捷方式。 多用于調(diào)試。 完整的對(duì)輸出的控制,請(qǐng)使用 string.format 以及 io.write。
注釋
Lua 中使用 --
作為行注釋,使用 --[[]]
作為塊注釋。
塊注釋的常見寫法如下,這樣只需要在塊注釋的最前面加上 “-” 即可取消整個(gè)塊注釋,非常實(shí)用的一個(gè)小技巧。
-- 行注釋
--[[塊注釋]]
--[[
塊注釋常見技巧:只要在塊注釋的前面加上“-”即可取消注釋
--]]
值和類型
Lua 中有八種基本類型:nil、boolean、number、string、function、userdata、
thread 和 table。
nil 和 false 都會(huì)導(dǎo)致條件判斷為假;而其它任何值都表示為真。
表、函數(shù)、線程、以及完全用戶數(shù)據(jù)在 Lua 中被稱為 對(duì)象:變量并不真的 持有 它們的值,而僅保存了對(duì)這些對(duì)象的 引用。賦值、參數(shù)傳遞、函數(shù)返回,都是針對(duì)引用而不是針對(duì)值的操作,這些操作均不會(huì)做任何形式的隱式拷貝。
Lua 是一門動(dòng)態(tài)類型語言。這意味著變量沒有類型;只有值才有類型。語言中不設(shè)類型定義。所有的值攜帶自己的類型。
Lua 中所有的值都是 一等公民。這意味著所有的值均可保存在變量中、當(dāng)作參數(shù)傳遞給其它函數(shù)、以及作為返回值。
Lua 中,函數(shù)可以保存在變量中、當(dāng)作參數(shù)傳遞給其它函數(shù)、以及作為返回值。
局部變量和全局變量
所有沒有顯式聲明為局部變量的變量名都被當(dāng)做全局變量。在編寫 Lua 代碼的時(shí)候如果不是全局變量一定記得添加 local。
b = 2 -- 全局變量 b
local a = 1 -- 局部變量 a
字符串
Lua 中字符串通常使用單引號(hào)或者雙引號(hào)來界定,但在某些特殊的情況下會(huì)用一對(duì)匹配的雙方括號(hào)來界定一個(gè)字母字符串,就像寫“塊注釋”那樣。這種寫法對(duì)于書寫那種含有程序代碼的字符串尤為有用。如果第一個(gè)字符是換行符,那么lua會(huì)忽略它。
在兩個(gè)方括號(hào)間加上任意數(shù)量的等號(hào),這樣字符串或者注釋只有遇到一個(gè)內(nèi)嵌有相同數(shù)量定好的雙右方括號(hào)時(shí)才會(huì)結(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 將迭代表中的鍵值對(duì)(
1,t[1]
) ,(2,t[2]
), … ,直到第一個(gè)空值。注意:是從 1 開始迭代,而不是從 0 開始迭代。 - pairs 能迭代表中的所有鍵值對(duì),而且迭代的順序是不保證的,每次執(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ù)組、序列、符號(hào)表、集合、記錄、圖、樹等等。對(duì)于記錄,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ù)只有一個(gè)參數(shù)并且該參數(shù)是一個(gè)字符串或者 table 時(shí),函數(shù)調(diào)用時(shí)的括號(hà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
的長度只在表是一個(gè) 序列 時(shí)有定義。序列指表的正數(shù)鍵集等于 {1..n} ,其中 n 是一個(gè)非負(fù)整數(shù)。在這種情況下,n 是表的長度。注意這樣的表 {10, 20, nil, 40}
不是一個(gè)序列,因?yàn)樗墟I 4
卻沒有鍵 3
,因此,該表的正整數(shù)鍵集不等于 {1..n} 集合,故而就不存在 n。注意:一張表是否是一個(gè)序列和它的非數(shù)字鍵無關(guān)。
取長度操作符對(duì)于不是序列(有時(shí)也稱為數(shù)組、線性表)的 table 來說是無意義的。
從下面的代碼的輸出很明顯可以看出:當(dāng) table 不是序列的時(shí)候,取長度操作符的結(jié)果是變動(dòng)的、無意義的。
-- #取長度操作符,table的長度是從1算起
local t1 = {}
t1[1] = 1
t1[2] = 2
print("t1", #t1) --> 2
-- #取長度操作符,返回一個(gè)數(shù)組或線性表的最后一個(gè)索引值。
-- #取長度操作符對(duì)于不是數(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 中,連接兩個(gè)字符串或者連接字符串和一個(gè)其他值使用字符串連接符 ..
。在使用過程中應(yīng)該在字符串連接符前面和后面都添加一個(gè)空格,例如:"str" .. 666
。特別當(dāng)其中一個(gè)值是 number 時(shí),如果寫成 "str"..666
或 666.."str"
這樣,運(yùn)行時(shí)就會(huì)出錯(cuò):unexpected symbol near '..'
。因?yàn)樽址B接符和數(shù)字之間沒有空格,Lua 就無法區(qū)分這是小數(shù)點(diǎn)還是字符串連接符了。所以在使用字符串連接符的時(shí)候,不要為了方便而省略空格。
本文出自 Eddy Wiki ,轉(zhuǎn)載請(qǐng)注明出處:http://eddy.wiki/lua-quick-start.html