【轉(zhuǎn)載請(qǐng)注明出處】:http://www.reibang.com/p/abd9eb83418c
基本語法
注釋
- 兩個(gè)減號(hào)是單行注釋:
--注釋
- 多行注釋
--[[ 注釋 --]]
標(biāo)示符
標(biāo)示符以字母或下劃線 _ 開頭藤乙,加上字母、下劃線或數(shù)字組成僻族。
最好不要使用下劃線加大寫字母的標(biāo)示符蜂桶,因?yàn)長(zhǎng)ua的保留字也是這樣的海雪。
關(guān)鍵詞
以下列出了 Lua 的保留關(guān)鍵字扒吁。保留關(guān)鍵字不能作為常量或變量或其他用戶自定義標(biāo)示符:
and 凹蜈、break 振峻、 do 公般、 else 万搔、 elseif 胡桨、end、false 瞬雹、for 昧谊、 function 、if 酗捌、in 呢诬、 local 、nil 胖缤、 not 尚镰、 or 、 repeat 哪廓、return 狗唉、 then 、true 撩独、until 敞曹、while
一般約定,以下劃線開頭連接一串大寫字母的名字(比如 _VERSION)被保留用于 Lua 內(nèi)部全局變量综膀。
全局變量
在默認(rèn)情況下,變量總是認(rèn)為是全局的局齿。
Lua 數(shù)據(jù)類型
Lua中有8個(gè)基本類型分別為:nil剧劝、boolean、number抓歼、string讥此、userdata、function谣妻、thread和table萄喳。
數(shù)據(jù)類型 | 描述 | 說明 |
---|---|---|
nil | 這個(gè)最簡(jiǎn)單,只有值nil屬于該類蹋半,表示一個(gè)無效值(在條件表達(dá)式中相當(dāng)于false)他巨。 | nil 作比較時(shí)應(yīng)該加上雙引號(hào) |
boolean | 包含兩個(gè)值:false和true。 | Lua 把 false 和 nil 看作是"假"减江,其他的都為"真" |
number | 表示雙精度類型的實(shí)浮點(diǎn)數(shù) | |
string | 字符串由一對(duì)雙引號(hào)或單引號(hào)來表示 | 也可以用 2 個(gè)方括號(hào) "[[]]" 來表示"一塊"字符串染突。 使用 # 來計(jì)算字符串的長(zhǎng)度 在對(duì)一個(gè)數(shù)字字符串上進(jìn)行算術(shù)操作時(shí),Lua 會(huì)嘗試將這個(gè)數(shù)字字符串轉(zhuǎn)成一個(gè)數(shù)字 |
function | 由 C 或 Lua 編寫的函數(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)建是通過"構(gòu)造表達(dá)式"來完成司志,最簡(jiǎn)單構(gòu)造表達(dá)式是{}甜紫,用來創(chuàng)建一個(gè)空表。 |
可以使用type函數(shù)測(cè)試給定變量或者值的類型骂远。
Lua 變量
Lua 變量有三種類型:全局變量棵介、局部變量、表中的域吧史。
Lua 中的變量全是全局變量邮辽,那怕是語句塊或是函數(shù)里,除非用 local 顯式聲明為局部變量贸营。
局部變量的作用域?yàn)閺穆暶魑恢瞄_始到所在語句塊結(jié)束吨述。
賦值語句
--賦值是改變一個(gè)變量的值和改變表域的最基本的方法。
a = "hello" .. "world"
t.n = t.n + 1
--Lua可以對(duì)多個(gè)變量同時(shí)賦值钞脂,變量列表和值列表的各個(gè)元素用逗號(hào)分開揣云,賦值語句右邊的值會(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)索引為字符串類型時(shí)的一種簡(jiǎn)化寫法
Lua 循環(huán)
Lua 語言提供了以下幾種循環(huán)處理方式:
循環(huán)類型 | 描述 |
---|---|
while 循環(huán) | 在條件為 true 時(shí)阎毅,讓程序重復(fù)地執(zhí)行某些語句焚刚。執(zhí)行語句前會(huì)先檢查條件是否為 true。 |
for 循環(huán) | 重復(fù)執(zhí)行指定語句扇调,重復(fù)次數(shù)可在 for 語句中控制矿咕。 |
repeat...until | 重復(fù)執(zhí)行循環(huán),直到 指定的條件為真時(shí)為止 |
循環(huán)嵌套 | 可以在循環(huán)內(nèi)嵌套一個(gè)或多個(gè)循環(huán)語句(while do ... end;for ... do ... end;repeat ... until;) |
while 循環(huán)
while(condition)
do
statements
end
數(shù)值for循環(huán)
Lua 編程語言中數(shù)值for循環(huán)語法格式:
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)通過一個(gè)迭代器函數(shù)來遍歷所有值涎拉,類似 java 中的 foreach 語句瑞侮。
for i, v in ipairs(value) do
statements
end
i是數(shù)組索引值,v是對(duì)應(yīng)索引的數(shù)組元素值曼库。ipairs是Lua提供的一個(gè)迭代器函數(shù)区岗,用來迭代數(shù)組。
repeat...until 循環(huán)
repeat
statements
until( condition )
Lua 流程控制
Lua 提供了以下控制結(jié)構(gòu)語句:
語句 | 描述 |
---|---|
if 語句 | if 語句 由一個(gè)布爾表達(dá)式作為條件判斷毁枯,其后緊跟其他語句組成慈缔。 |
if...else 語句 | if 語句 可以與 else 語句搭配使用, 在 if 條件表達(dá)式為 false 時(shí)執(zhí)行 else 語句代碼。 |
if 嵌套語句 | 你可以在if 或 else if中使用一個(gè)或多個(gè) if 或 else if 語句 种玛。 |
if 語句
if(condition)
then
statements
end
if...else 語句
if(condition)
then
statements1
else
statements2
end
if...elseif...else 語句
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ù)名稱娱节。
- argument1, argument2, argument3..., argumentn: 函數(shù)參數(shù)挠蛉,多個(gè)參數(shù)以逗號(hào)隔開,函數(shù)也可以不帶參數(shù)肄满。
- function_body: 函數(shù)體谴古,函數(shù)中需要執(zhí)行的代碼語句塊。
- result_params_comma_separated: 函數(shù)返回值稠歉,Lua語言函數(shù)可以返回多個(gè)值掰担,每個(gè)值以逗號(hào)隔開。
多返回值
Lua函數(shù)中怒炸,在return后列出要返回的值的列表即可返回多值带饱。
可變參數(shù)
Lua 函數(shù)可以接受可變數(shù)目的參數(shù),和 C 語言類似阅羹,在函數(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ù)來訪問變長(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 語言中字符串可以使用以下三種方式來表示:
- 單引號(hào)間的一串字符溉痢。
- 雙引號(hào)間的一串字符僻造。
- [[和]]間的一串字符。
字符串操作
方法 | 用途 |
---|---|
string.upper(argument) | 全部轉(zhuǎn)為大寫 |
string.lower(argument) | 全部轉(zhuǎn)為小寫 |
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è)類似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 描述的字符串沒有找到忍些,迭代函數(shù)返回nil鲁猩。 |
string.match(str, pattern, init) | string.match()只尋找源字串str中的第一個(gè)配對(duì). 參數(shù)init可選, 指定搜尋過程的起點(diǎn), 默認(rèn)為1。 在成功配對(duì)時(shí), 函數(shù)將返回配對(duì)表達(dá)式中的所有捕獲結(jié)果; 如果沒有設(shè)置捕獲標(biāo)記, 則返回整個(gè)配對(duì)字符串. 當(dāng)沒有成功的配對(duì)時(shí), 返回nil罢坝。 |
Lua 數(shù)組
Lua 數(shù)組的索引鍵值可以使用整數(shù)表示廓握,數(shù)組的大小不是固定的。
可以使用整數(shù)索引來訪問數(shù)組元素嘁酿,如果指定的索引沒有值則返回nil隙券。
Lua 索引值是以 1 為起始,但也可以指定 0 開始闹司,除此之外還可以以負(fù)數(shù)為數(shù)組索引值娱仔。
Lua 迭代器
迭代器(iterator)是一種對(duì)象,它能夠用來遍歷標(biāo)準(zhǔn)模板庫(kù)容器中的部分或全部元素游桩,每個(gè)迭代器對(duì)象代表容器中的確定的地址
在Lua中迭代器是一種支持指針類型的結(jié)構(gòu)牲迫,它可以遍歷集合的每一個(gè)元素。
泛型 for 迭代器
泛型 for 在自己內(nèi)部保存迭代函數(shù)借卧,實(shí)際上它保存三個(gè)值:迭代函數(shù)盹憎、狀態(tài)常量、控制變量铐刘。
泛型 for 迭代器提供了集合的 key/value 對(duì)陪每,語法格式如下:
for k, v in pairs(t) do
print(k, v)
end
k, v為變量列表;pairs(t)為表達(dá)式列表。
Lua 的迭代器包含以下兩種類型:
無狀態(tài)的迭代器
無狀態(tài)的迭代器是指不保留任何狀態(tài)的迭代器奶稠,因此在循環(huán)中可以利用無狀態(tài)迭代器避免創(chuàng)建閉包花費(fèi)額外的代價(jià)俯艰。
每一次迭代,迭代函數(shù)都是用兩個(gè)變量(狀態(tài)常量和控制變量)的值作為參數(shù)被調(diào)用锌订,一個(gè)無狀態(tài)的迭代器只利用這兩個(gè)值可以獲取下一個(gè)元素竹握。
例如使用一個(gè)簡(jiǎn)單的函數(shù)來實(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)用來幫助我們創(chuàng)建不同的數(shù)據(jù)類型侥衬,如:數(shù)組、字典等跑芳。
Lua table 使用關(guān)聯(lián)型數(shù)組轴总,可以用任意類型的值來作數(shù)組的索引,但這個(gè)值不能是 nil博个。
Lua table 是不固定大小的怀樟,可以根據(jù)自己需要進(jìn)行擴(kuò)容。
Lua也是通過table來解決模塊(module)盆佣、包(package)和對(duì)象(Object)的往堡。 例如string.format表示使用"format"來索引table string。
方法 | 用途 |
---|---|
table.concat (tableObj [, separator [, startIndex [, endIndex]]]) | 列出tableObj從startIndex位置到endIndex位置的所有元素, 元素間以指定的分隔符(separator)隔開共耍。 |
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.reibang.com/p/abd9eb83418c