Lua 基礎(chǔ)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市着绊,隨后出現(xiàn)的幾起案子谐算,更是在濱河造成了極大的恐慌,老刑警劉巖归露,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洲脂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)恐锦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門往果,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人一铅,你說我怎么就攤上這事陕贮。” “怎么了潘飘?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我炼鞠,道長(zhǎng)捂敌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任艰毒,我火速辦了婚禮筐高,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丑瞧。我一直安慰自己柑土,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布嗦篱。 她就那樣靜靜地躺著冰单,像睡著了一般。 火紅的嫁衣襯著肌膚如雪灸促。 梳的紋絲不亂的頭發(fā)上诫欠,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音浴栽,去河邊找鬼荒叼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛典鸡,可吹牛的內(nèi)容都是我干的被廓。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼萝玷,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼嫁乘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起球碉,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤蜓斧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后睁冬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挎春,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了直奋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片能庆。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖脚线,靈堂內(nèi)的尸體忽然破棺而出搁胆,到底是詐尸還是另有隱情,我是刑警寧澤殉挽,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布丰涉,位于F島的核電站,受9級(jí)特大地震影響斯碌,放射性物質(zhì)發(fā)生泄漏一死。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一傻唾、第九天 我趴在偏房一處隱蔽的房頂上張望投慈。 院中可真熱鬧,春花似錦冠骄、人聲如沸伪煤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抱既。三九已至,卻和暖如春扁誓,著一層夾襖步出監(jiān)牢的瞬間防泵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工蝗敢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捷泞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓寿谴,卻偏偏與公主長(zhǎng)得像锁右,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讶泰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351