Lua 基礎(chǔ)

【轉(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ǔ)句 你可以在ifelse if中使用一個(gè)或多個(gè) ifelse 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

最后編輯于
?著作權(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ù)。

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