Lua 快速入門(mén)

Lua 是一門(mén)強(qiáng)大、快速、輕量的嵌入式腳本語(yǔ)言,那么我們?nèi)绾尾拍軌蚩焖賹W(xué)習(xí)和掌握 Lua 語(yǔ)言呢?在這我將分享一下我的 Lua 快速入門(mén)經(jīng)驗(yàn),希望對(duì)大家有所幫助。

Lua 安裝

Lua 的安裝過(guò)程可以參考 Lua 官網(wǎng) 或云風(fēng)翻譯的 Lua 5.3 參考手冊(cè)。

在 Mac OS 上安裝

  1. 從 Lua 官網(wǎng)下載 Lua 最新的源碼,然后解壓。
  2. 打開(kāi)終端,并 cd 到解壓后的 Lua 源碼目錄 lua-5.3.2/。
  3. 在終端中輸入 make macosx install 構(gòu)建并安裝 Lua。
  4. 在終端中輸入 lua -v 查看 Lua 是否已經(jīng)安裝完成。

PS:如果你沒(méi)有安裝 Xcode 和命令行工具是不能使用 make 命令的。

在 Windows 上安裝

下載 luaforwindows 并安裝,這樣 lua 的開(kāi)發(fā)環(huán)境就搭建好了,安裝后可以直接使用 SciTE IDE 來(lái)進(jìn)行 lua 代碼的編寫(xiě)和運(yùn)行。

Lua 編輯器的選擇

在這里介紹一下怎么使用 Sublime Text 來(lái)編寫(xiě)和運(yùn)行 Lua 代碼,當(dāng)然你也可以使用其他文本編輯器或者 IDE 來(lái)編寫(xiě)和運(yùn)行 Lua 代碼,例如在 Windows 上你可以直接使用上面所說(shuō)的 SciTE。

  1. 下載并安裝 Sublime Text

  2. 打開(kāi) 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"
}
  1. 在 Sublime Text 中新建一個(gè)文件,輸入 print("hello world") 并保存為 test.lua,然后 ctrl + b 運(yùn)行,這個(gè)時(shí)候我們就能在 Sublime Text 中的控制臺(tái)看到輸出 "hello world"。

Lua 快速入門(mén)資料

  1. Lua 官方參考手冊(cè) 或云風(fēng)翻譯的 Lua 5.3 參考手冊(cè)
  2. 書(shū)籍《Lua 程序設(shè)計(jì)》。

Lua 參考手冊(cè)非常適合作為快速入門(mén)的閱讀資料,對(duì) Lua 的語(yǔ)法等有疑惑時(shí)查看 Lua 參考手冊(cè)也能快速解惑?!禠ua 程序設(shè)計(jì)》除了介紹 Lua 的語(yǔ)法等基礎(chǔ)知識(shí)外,還會(huì)介紹一些 Lua 高級(jí)的用法,例如:面向?qū)ο缶幊蹋ㄔ?Lua 中怎么實(shí)現(xiàn)類、繼承、多重繼承等),所以《Lua 程序設(shè)計(jì)》也是非常值得去購(gòu)買的一本書(shū)籍。

PS:在學(xué)習(xí)的過(guò)程中,建議對(duì)于不理解和有疑惑的地方參照資料自己動(dòng)手編寫(xiě)代碼并運(yùn)行查看輸出結(jié)果。

Lua 語(yǔ)法

這里主要簡(jiǎn)單介紹一下 Lua 的語(yǔ)法和在使用過(guò)程中特別需要注意事項(xiàng),同時(shí)對(duì) Lua 和其他一些編程語(yǔ)言很不一樣的地方進(jìn)行說(shuō)明。以下的部分內(nèi)容引用自:云風(fēng)翻譯的 Lua 5.3 參考手冊(cè) 和《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 中使用 -- 作為行注釋,使用 --[[]] 作為塊注釋。

塊注釋的常見(jiàn)寫(xiě)法如下,這樣只需要在塊注釋的最前面加上 “-” 即可取消整個(gè)塊注釋,非常實(shí)用的一個(gè)小技巧。

-- 行注釋
--[[塊注釋]]
--[[
塊注釋常見(jiàn)技巧:只要在塊注釋的前面加上“-”即可取消注釋
--]]

值和類型

Lua 中有八種基本類型:nil、boolean、number、string、function、userdata、
threadtable。

nil 和 false 都會(huì)導(dǎo)致條件判斷為假;而其它任何值都表示為真。

表、函數(shù)、線程、以及完全用戶數(shù)據(jù)在 Lua 中被稱為 對(duì)象:變量并不真的 持有 它們的值,而僅保存了對(duì)這些對(duì)象的 引用。賦值、參數(shù)傳遞、函數(shù)返回,都是針對(duì)引用而不是針對(duì)值的操作,這些操作均不會(huì)做任何形式的隱式拷貝。

Lua 是一門(mén)動(dòng)態(tài)類型語(yǔ)言。這意味著變量沒(méi)有類型;只有值才有類型。語(yǔ)言中不設(shè)類型定義。所有的值攜帶自己的類型。

Lua 中所有的值都是 一等公民。這意味著所有的值均可保存在變量中、當(dāng)作參數(shù)傳遞給其它函數(shù)、以及作為返回值。

Lua 中,函數(shù)可以保存在變量中、當(dāng)作參數(shù)傳遞給其它函數(shù)、以及作為返回值。

局部變量和全局變量

所有沒(méi)有顯式聲明為局部變量的變量名都被當(dāng)做全局變量。在編寫(xiě) Lua 代碼的時(shí)候如果不是全局變量一定記得添加 local。

b = 2 -- 全局變量 b
local a = 1 -- 局部變量 a

字符串

Lua 中字符串通常使用單引號(hào)或者雙引號(hào)來(lái)界定,但在某些特殊的情況下會(huì)用一對(duì)匹配的雙方括號(hào)來(lái)界定一個(gè)字母字符串,就像寫(xiě)“塊注釋”那樣。這種寫(xiě)法對(duì)于書(shū)寫(xiě)那種含有程序代碼的字符串尤為有用。如果第一個(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

  1. ipairs 將迭代表中的鍵值對(duì)(1,t[1]) ,(2,t[2]), … ,直到第一個(gè)空值。注意:是從 1 開(kāi)始迭代,而不是從 0 開(kāi)始迭代。
  2. 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)表、集合、記錄、圖、樹(shù)等等。對(duì)于記錄,Lua 使用域名作為索引。語(yǔ)言提供了 a.name 這樣的語(yǔ)法糖來(lái)替代a["name"] 這種寫(xiě)法以方便記錄這種結(jié)構(gòu)的使用。

table 構(gòu)造式

  1. 列表風(fēng)格構(gòu)造式:{”r“, "g", "b"}
  2. 記錄風(fēng)格構(gòu)造式:{x = 10, y = 20}
  3. 通用風(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{})

取長(zhǎng)度操作符

如果 __len 元方法沒(méi)有給出,表 t 的長(zhǎng)度只在表是一個(gè) 序列 時(shí)有定義。序列指表的正數(shù)鍵集等于 {1..n} ,其中 n 是一個(gè)非負(fù)整數(shù)。在這種情況下,n 是表的長(zhǎng)度。注意這樣的表 {10, 20, nil, 40} 不是一個(gè)序列,因?yàn)樗墟I 4卻沒(méi)有鍵 3,因此,該表的正整數(shù)鍵集不等于 {1..n} 集合,故而就不存在 n。注意:一張表是否是一個(gè)序列和它的非數(shù)字鍵無(wú)關(guān)。

取長(zhǎng)度操作符對(duì)于不是序列(有時(shí)也稱為數(shù)組、線性表)的 table 來(lái)說(shuō)是無(wú)意義的。

從下面的代碼的輸出很明顯可以看出:當(dāng) table 不是序列的時(shí)候,取長(zhǎng)度操作符的結(jié)果是變動(dòng)的、無(wú)意義的。

-- #取長(zhǎng)度操作符,table的長(zhǎng)度是從1算起
local t1 = {}
t1[1] = 1
t1[2] = 2
print("t1", #t1) --> 2

-- #取長(zhǎng)度操作符,返回一個(gè)數(shù)組或線性表的最后一個(gè)索引值。
-- #取長(zhǎng)度操作符對(duì)于不是數(shù)組或者線性表的table來(lái)說(shuō)是無(wú)意義的。
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è)其他值使用字符串連接符 ..。在使用過(guò)程中應(yīng)該在字符串連接符前面和后面都添加一個(gè)空格,例如:"str" .. 666。特別當(dāng)其中一個(gè)值是 number 時(shí),如果寫(xiě)成 "str"..666666.."str" 這樣,運(yùn)行時(shí)就會(huì)出錯(cuò):unexpected symbol near '..'。因?yàn)樽址B接符和數(shù)字之間沒(méi)有空格,Lua 就無(wú)法區(qū)分這是小數(shù)點(diǎn)還是字符串連接符了。所以在使用字符串連接符的時(shí)候,不要為了方便而省略空格。


本文出自 Eddy Wiki ,轉(zhuǎn)載請(qǐng)注明出處:http://eddy.wiki/lua-quick-start.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容