【轉(zhuǎn)載請(qǐng)注明出處】:http://www.itdecent.cn/p/abd9eb83418c
基本語(yǔ)法
注釋
- 兩個(gè)減號(hào)是單行注釋:
--注釋 - 多行注釋
--[[ 注釋 --]]
標(biāo)示符
標(biāo)示符以字母或下劃線 _ 開(kāi)頭,加上字母、下劃線或數(shù)字組成。
最好不要使用下劃線加大寫(xiě)字母的標(biāo)示符,因?yàn)長(zhǎng)ua的保留字也是這樣的。
關(guān)鍵詞
以下列出了 Lua 的保留關(guān)鍵字。保留關(guān)鍵字不能作為常量或變量或其他用戶(hù)自定義標(biāo)示符:
and 、break 、 do 、 else 、 elseif 、end、false 、for 、 function 、if 、in 、 local 、nil 、 not 、 or 、 repeat 、return 、 then 、true 、until 、while
一般約定,以下劃線開(kāi)頭連接一串大寫(xiě)字母的名字(比如 _VERSION)被保留用于 Lua 內(nèi)部全局變量。
全局變量
在默認(rèn)情況下,變量總是認(rèn)為是全局的。
Lua 數(shù)據(jù)類(lèi)型
Lua中有8個(gè)基本類(lèi)型分別為:nil、boolean、number、string、userdata、function、thread和table。
| 數(shù)據(jù)類(lèi)型 | 描述 | 說(shuō)明 |
|---|---|---|
| nil | 這個(gè)最簡(jiǎn)單,只有值nil屬于該類(lèi),表示一個(gè)無(wú)效值(在條件表達(dá)式中相當(dāng)于false)。 | nil 作比較時(shí)應(yīng)該加上雙引號(hào) |
| boolean | 包含兩個(gè)值:false和true。 | Lua 把 false 和 nil 看作是"假",其他的都為"真" |
| number | 表示雙精度類(lèi)型的實(shí)浮點(diǎn)數(shù) | |
| string | 字符串由一對(duì)雙引號(hào)或單引號(hào)來(lái)表示 | 也可以用 2 個(gè)方括號(hào) "[[]]" 來(lái)表示"一塊"字符串。 使用 # 來(lái)計(jì)算字符串的長(zhǎng)度 在對(duì)一個(gè)數(shù)字字符串上進(jìn)行算術(shù)操作時(shí),Lua 會(huì)嘗試將這個(gè)數(shù)字字符串轉(zhuǎn)成一個(gè)數(shù)字 |
| function | 由 C 或 Lua 編寫(xiě)的函數(shù) | |
| userdata | 表示任意存儲(chǔ)在變量中的C數(shù)據(jù)結(jié)構(gòu) | |
| thread | 表示執(zhí)行的獨(dú)立線路,用于執(zhí)行協(xié)同程序 | |
| table | Lua 中的表(table)其實(shí)是一個(gè)"關(guān)聯(lián)數(shù)組"(associative arrays),數(shù)組的索引可以是數(shù)字或者是字符串。在 Lua 里,table 的創(chuàng)建是通過(guò)"構(gòu)造表達(dá)式"來(lái)完成,最簡(jiǎn)單構(gòu)造表達(dá)式是{},用來(lái)創(chuàng)建一個(gè)空表。 |
可以使用type函數(shù)測(cè)試給定變量或者值的類(lèi)型。
Lua 變量
Lua 變量有三種類(lèi)型:全局變量、局部變量、表中的域。
Lua 中的變量全是全局變量,那怕是語(yǔ)句塊或是函數(shù)里,除非用 local 顯式聲明為局部變量。
局部變量的作用域?yàn)閺穆暶魑恢瞄_(kāi)始到所在語(yǔ)句塊結(jié)束。
賦值語(yǔ)句
--賦值是改變一個(gè)變量的值和改變表域的最基本的方法。
a = "hello" .. "world"
t.n = t.n + 1
--Lua可以對(duì)多個(gè)變量同時(shí)賦值,變量列表和值列表的各個(gè)元素用逗號(hào)分開(kāi),賦值語(yǔ)句右邊的值會(huì)依次賦給左邊的變量。
a, b = 10, 2*x -- 等價(jià)于 a=10; b=2*x
當(dāng)變量個(gè)數(shù)和值的個(gè)數(shù)不一致時(shí),Lua會(huì)一直以變量個(gè)數(shù)為基礎(chǔ)采取以下策略:
- 變量個(gè)數(shù) > 值的個(gè)數(shù) 按變量個(gè)數(shù)補(bǔ)足nil
- 變量個(gè)數(shù) < 值的個(gè)數(shù) 多余的值會(huì)被忽略
索引
對(duì) table 的索引使用方括號(hào) []。Lua 也提供了 . 操作。
t[i]
t.i -- 當(dāng)索引為字符串類(lèi)型時(shí)的一種簡(jiǎn)化寫(xiě)法
Lua 循環(huán)
Lua 語(yǔ)言提供了以下幾種循環(huán)處理方式:
| 循環(huán)類(lèi)型 | 描述 |
|---|---|
| while 循環(huán) | 在條件為 true 時(shí),讓程序重復(fù)地執(zhí)行某些語(yǔ)句。執(zhí)行語(yǔ)句前會(huì)先檢查條件是否為 true。 |
| for 循環(huán) | 重復(fù)執(zhí)行指定語(yǔ)句,重復(fù)次數(shù)可在 for 語(yǔ)句中控制。 |
| repeat...until | 重復(fù)執(zhí)行循環(huán),直到 指定的條件為真時(shí)為止 |
| 循環(huán)嵌套 | 可以在循環(huán)內(nèi)嵌套一個(gè)或多個(gè)循環(huán)語(yǔ)句(while do ... end;for ... do ... end;repeat ... until;) |
while 循環(huán)
while(condition)
do
statements
end
數(shù)值for循環(huán)
Lua 編程語(yǔ)言中數(shù)值for循環(huán)語(yǔ)法格式:
for var=exp1,exp2,exp3 do
statements
end
var 從 exp1 變化到 exp2,每次變化以 exp3 為步長(zhǎng)遞增 var,并執(zhí)行一次 "執(zhí)行體"。exp3 是可選的,如果不指定,默認(rèn)為1。
泛型for循環(huán)
泛型 for 循環(huán)通過(guò)一個(gè)迭代器函數(shù)來(lái)遍歷所有值,類(lèi)似 java 中的 foreach 語(yǔ)句。
for i, v in ipairs(value) do
statements
end
i是數(shù)組索引值,v是對(duì)應(yīng)索引的數(shù)組元素值。ipairs是Lua提供的一個(gè)迭代器函數(shù),用來(lái)迭代數(shù)組。
repeat...until 循環(huán)
repeat
statements
until( condition )
Lua 流程控制
Lua 提供了以下控制結(jié)構(gòu)語(yǔ)句:
| 語(yǔ)句 | 描述 |
|---|---|
| if 語(yǔ)句 | if 語(yǔ)句 由一個(gè)布爾表達(dá)式作為條件判斷,其后緊跟其他語(yǔ)句組成。 |
| if...else 語(yǔ)句 | if 語(yǔ)句 可以與 else 語(yǔ)句搭配使用, 在 if 條件表達(dá)式為 false 時(shí)執(zhí)行 else 語(yǔ)句代碼。 |
| if 嵌套語(yǔ)句 | 你可以在if 或 else if中使用一個(gè)或多個(gè) if 或 else if 語(yǔ)句 。 |
if 語(yǔ)句
if(condition)
then
statements
end
if...else 語(yǔ)句
if(condition)
then
statements1
else
statements2
end
if...elseif...else 語(yǔ)句
if(condition1)
then
statements1
elseif(condition2)
then
statements2
else
statements3
end
Lua 函數(shù)
函數(shù)定義
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end
- optional_function_scope: 該參數(shù)是可選的制定函數(shù)是全局函數(shù)還是局部函數(shù),未設(shè)置該參數(shù)默認(rèn)為全局函數(shù),如果你需要設(shè)置函數(shù)為局部函數(shù)需要使用關(guān)鍵字 local。
- function_name: 指定函數(shù)名稱(chēng)。
- argument1, argument2, argument3..., argumentn: 函數(shù)參數(shù),多個(gè)參數(shù)以逗號(hào)隔開(kāi),函數(shù)也可以不帶參數(shù)。
- function_body: 函數(shù)體,函數(shù)中需要執(zhí)行的代碼語(yǔ)句塊。
- result_params_comma_separated: 函數(shù)返回值,Lua語(yǔ)言函數(shù)可以返回多個(gè)值,每個(gè)值以逗號(hào)隔開(kāi)。
多返回值
Lua函數(shù)中,在return后列出要返回的值的列表即可返回多值。
可變參數(shù)
Lua 函數(shù)可以接受可變數(shù)目的參數(shù),和 C 語(yǔ)言類(lèi)似,在函數(shù)參數(shù)列表中使用三點(diǎn) ... 表示函數(shù)有可變的參數(shù)。
有時(shí)候可能需要幾個(gè)固定參數(shù)加上可變參數(shù),則固定參數(shù)必須放在變長(zhǎng)參數(shù)之前。
通常在遍歷變長(zhǎng)參數(shù)的時(shí)候只需要使用 {…},然而變長(zhǎng)參數(shù)可能會(huì)包含一些 nil,那么就可以用 select 函數(shù)來(lái)訪問(wèn)變長(zhǎng)參數(shù)了:select('#', …) 或者 select(n, …)
- select('#', …) 返回可變參數(shù)的長(zhǎng)度
- select(n, …) 返回它的第n個(gè)可變實(shí)參
function average(...)
result = 0
local arg={...}
for i,v in ipairs(arg) do
result = result + v
end
return result/#arg --或者 return result/select("#",...)
end
Lua 運(yùn)算符
算術(shù)運(yùn)算符
| 操作符 | 描述 |
|---|---|
| + | 加法 |
| - | 減法/負(fù)號(hào) |
| * | 乘法 |
| / | 除法 |
| % | 取余 |
| ^ | 乘冪 |
關(guān)系運(yùn)算符
| 操作符 | 描述 |
|---|---|
| == | 等于,檢測(cè)兩個(gè)值是否相等,相等返回 true,否則返回 false |
| ~= | 不等于,檢測(cè)兩個(gè)值是否相等,相等返回 false,否則返回 true |
| > | 大于,如果左邊的值大于右邊的值,返回 true,否則返回 false |
| < | 小于,如果左邊的值大于右邊的值,返回 false,否則返回 true |
| >= | 大于等于,如果左邊的值大于等于右邊的值,返回 true,否則返回 false |
| <= | 小于等于, 如果左邊的值小于等于右邊的值,返回 true,否則返回 false |
邏輯運(yùn)算符
| 操作符 | 描述 |
|---|---|
| and | 邏輯與操作符。 |
| or | 邏輯或操作符。 |
| not | 邏輯非操作符。 |
其他運(yùn)算符
| 操作符 | 描述 |
|---|---|
| .. | 連接兩個(gè)字符串 |
| # | 一元運(yùn)算符,返回字符串或表的長(zhǎng)度。 |
運(yùn)算符優(yōu)先級(jí)
| 從高到低的順序 |
|---|
| ^ |
| not - (unary) |
| * / |
| + - |
| .. |
| < > <= >= ~= == |
| and |
| or |
除了^和..外所有的二元運(yùn)算符都是左連接的。
Lua 字符串
Lua 語(yǔ)言中字符串可以使用以下三種方式來(lái)表示:
- 單引號(hào)間的一串字符。
- 雙引號(hào)間的一串字符。
- [[和]]間的一串字符。
字符串操作
| 方法 | 用途 |
|---|---|
| string.upper(argument) | 全部轉(zhuǎn)為大寫(xiě) |
| string.lower(argument) | 全部轉(zhuǎn)為小寫(xiě) |
| string.gsub(mainString,findString,replaceString,num) | 在字符串中替換,mainString為要替換的字符串, findString 為被替換的字符,replaceString 要替換成的字符,num 替換次數(shù)(可以忽略,則全部替換) |
| string.find (mainString, findString, [startIndex, [endIndex]]) | 在一個(gè)指定的目標(biāo)字符串中搜索指定的內(nèi)容(第三個(gè)參數(shù)為索引),返回其具體位置。不存在則返回 nil。 |
| string.reverse(arg) | 字符串反轉(zhuǎn) |
| string.format(...) | 返回一個(gè)類(lèi)似printf的格式化字符串 |
| string.char(ASCIICodes...) | 將ASCII碼轉(zhuǎn)成字符并連接 |
| string.byte(str[,index]) | 將指定的字符轉(zhuǎn)成ASCII碼(默認(rèn)第一個(gè)字符) |
| string.len(arg) | 計(jì)算字符串長(zhǎng)度 |
| string.rep(str, n) | 返回字符串string的n個(gè)拷貝 |
| .. | 鏈接兩個(gè)字符串 |
| string.gmatch(str, pattern) | 返回一個(gè)迭代器函數(shù),每一次調(diào)用這個(gè)函數(shù),返回一個(gè)在字符串 str 找到的下一個(gè)符合 pattern 描述的子串。如果參數(shù) pattern 描述的字符串沒(méi)有找到,迭代函數(shù)返回nil。 |
| string.match(str, pattern, init) | string.match()只尋找源字串str中的第一個(gè)配對(duì). 參數(shù)init可選, 指定搜尋過(guò)程的起點(diǎn), 默認(rèn)為1。 在成功配對(duì)時(shí), 函數(shù)將返回配對(duì)表達(dá)式中的所有捕獲結(jié)果; 如果沒(méi)有設(shè)置捕獲標(biāo)記, 則返回整個(gè)配對(duì)字符串. 當(dāng)沒(méi)有成功的配對(duì)時(shí), 返回nil。 |
Lua 數(shù)組
Lua 數(shù)組的索引鍵值可以使用整數(shù)表示,數(shù)組的大小不是固定的。
可以使用整數(shù)索引來(lái)訪問(wèn)數(shù)組元素,如果指定的索引沒(méi)有值則返回nil。
Lua 索引值是以 1 為起始,但也可以指定 0 開(kāi)始,除此之外還可以以負(fù)數(shù)為數(shù)組索引值。
Lua 迭代器
迭代器(iterator)是一種對(duì)象,它能夠用來(lái)遍歷標(biāo)準(zhǔn)模板庫(kù)容器中的部分或全部元素,每個(gè)迭代器對(duì)象代表容器中的確定的地址
在Lua中迭代器是一種支持指針類(lèi)型的結(jié)構(gòu),它可以遍歷集合的每一個(gè)元素。
泛型 for 迭代器
泛型 for 在自己內(nèi)部保存迭代函數(shù),實(shí)際上它保存三個(gè)值:迭代函數(shù)、狀態(tài)常量、控制變量。
泛型 for 迭代器提供了集合的 key/value 對(duì),語(yǔ)法格式如下:
for k, v in pairs(t) do
print(k, v)
end
k, v為變量列表;pairs(t)為表達(dá)式列表。
Lua 的迭代器包含以下兩種類(lèi)型:
無(wú)狀態(tài)的迭代器
無(wú)狀態(tài)的迭代器是指不保留任何狀態(tài)的迭代器,因此在循環(huán)中可以利用無(wú)狀態(tài)迭代器避免創(chuàng)建閉包花費(fèi)額外的代價(jià)。
每一次迭代,迭代函數(shù)都是用兩個(gè)變量(狀態(tài)常量和控制變量)的值作為參數(shù)被調(diào)用,一個(gè)無(wú)狀態(tài)的迭代器只利用這兩個(gè)值可以獲取下一個(gè)元素。
例如使用一個(gè)簡(jiǎn)單的函數(shù)來(lái)實(shí)現(xiàn)迭代器,實(shí)現(xiàn)數(shù)字 n 的平方:
function square(iteratorMaxCount,currentNumber)
if currentNumber<iteratorMaxCount
then
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end
for i,n in square,3,0
do
print(i,n)
end
多狀態(tài)的迭代器
很多情況下,迭代器需要保存多個(gè)狀態(tài)信息而不是簡(jiǎn)單的狀態(tài)常量和控制變量,最簡(jiǎn)單的方法是使用閉包,還有一種方法就是將所有的狀態(tài)信息封裝到table內(nèi),將table作為迭代器的狀態(tài)常量,因?yàn)檫@種情況下可以將所有的信息存放在table內(nèi),所以迭代函數(shù)通常不需要第二個(gè)參數(shù)。
例如:
function elementIterator (collection)
local index = 0
local count = #collection
-- 閉包函數(shù)
return function ()
index = index + 1
if index <= count
then
-- 返回迭代器的當(dāng)前元素
return collection[index]
end
end
end
array = {"Lua", "Tutorial"}
for element in elementIterator(array)
do
print(element)
end
Lua table(表)
table 是 Lua 的一種數(shù)據(jù)結(jié)構(gòu)用來(lái)幫助我們創(chuàng)建不同的數(shù)據(jù)類(lèi)型,如:數(shù)組、字典等。
Lua table 使用關(guān)聯(lián)型數(shù)組,可以用任意類(lèi)型的值來(lái)作數(shù)組的索引,但這個(gè)值不能是 nil。
Lua table 是不固定大小的,可以根據(jù)自己需要進(jìn)行擴(kuò)容。
Lua也是通過(guò)table來(lái)解決模塊(module)、包(package)和對(duì)象(Object)的。 例如string.format表示使用"format"來(lái)索引table string。
| 方法 | 用途 |
|---|---|
| table.concat (tableObj [, separator [, startIndex [, endIndex]]]) | 列出tableObj從startIndex位置到endIndex位置的所有元素, 元素間以指定的分隔符(separator)隔開(kāi)。 |
| table.insert (tableObj, [index,] value) | 在tableObj的指定位置(index)插入值為value的一個(gè)元素。index參數(shù)可選, 默認(rèn)為末尾。 |
| table.remove (tableObj [, index]) | 返回tableObj位于index位置的元素。 其后的元素會(huì)被前移。index參數(shù)可選, 默認(rèn)為table長(zhǎng)度, 即從最后一個(gè)元素刪起。 |
| table.sort (tableObj [, comp]) | 對(duì)給定的table進(jìn)行升序排序。comp應(yīng)滿足以下條件: 接受兩個(gè)參數(shù)(依次為a, b), 并返回一個(gè)布爾型的值, 當(dāng)a應(yīng)該排在b前面時(shí), 返回true, 反之返回false. |
【轉(zhuǎn)載請(qǐng)注明出處】:http://www.itdecent.cn/p/abd9eb83418c