小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Lua腳本之語法基礎(chǔ)快速入門

 quasiceo 2014-01-16
  •       Lua的語法基礎(chǔ)超級簡單,非常易于上手,下面總結(jié)一些學(xué)習(xí)過程中的Lua語法基礎(chǔ):

       在開始學(xué)習(xí)之前,先介紹一些最基本的概念,在Lua中具有一個代碼塊的概念,每個函數(shù)或者for循環(huán)等都是一個代碼塊。在Lua中,用 “- - ”來標(biāo)記該行的注釋,使用“- - [ [” 和   “ - - ] ] ”之間括起來的部分進(jìn)行塊注釋。如下所示:

  1. -- 行注釋,僅僅注釋當(dāng)前行  
  2. for idx = 1, 10 do  --在代碼之后進(jìn)行行注釋  
  3.      print("idx=",idx);    
  4. end  
  5. --[[  
  6. 塊注釋,上邊的for循環(huán)結(jié)構(gòu)跟end結(jié)合起來就是一個Lua中常見的代碼塊結(jié)構(gòu)。  
  7. --]]  
         另外,Lua中支持的算術(shù)運(yùn)算符有:+、-、*、/,即加、減、乘、除;支持的關(guān)系運(yùn)算符有:==、~=(不等于)、<、>、<=、>=;支持的邏輯運(yùn)算符有:and、or、not。需要注意的是,在Lua中,and邏輯運(yùn)算符如果第一個參數(shù)是false,則返回false,不會執(zhí)行第二個參數(shù)的代碼(即使第二個參數(shù)是一個錯誤的表達(dá)式,也能順利運(yùn)行);如果第一個參數(shù)是true,返回第二個參數(shù)的值。 同理,or邏輯運(yùn)算符如果第一個參數(shù)不是false,則返回第一個參數(shù)的值(不會執(zhí)行第二個參數(shù)的代碼);否則返回第二個參數(shù)的值。這就是所謂的邏輯運(yùn)算符短路求值
  1. result = true  
  2. if result and an_donot_defined_method() then  
  3.   print("no erro occured!")  
  4. end  
  5. --[[  
  6. 上述代碼輸出的錯誤如下:  
  7. stdin:1: attempt to call global 'an_donot_defined_method' (a nil value)  
  8. stack traceback:  
  9.     stdin:1: in main chunk  
  10.     [C]: ?  
  11. --]]  
  12. result =false   
  13. if (result and an_donot_defined_method())==false  then  
  14.   print("no erro occured!")  
  15. end  
  16. --上述代碼順利通過編譯,即使有一個沒定義的方法,打印結(jié)果:no erro occured!  


一、基本數(shù)據(jù)類型

          Lua中具有5種基本的數(shù)據(jù)類型,nil、Boolean、string、Number和table在Lua中使用變量不需要提前聲明,變量的類型決定于用戶賦值的類型可以使用 type()函數(shù)判斷變量的類型。其中,nil、Boolean、Number都是用法比較簡單的類型,string、table類型用法稍微復(fù)雜點(diǎn)。給一個變量賦值為nil,表示釋放該變量。Boolean跟其他語言一樣,只有true和false兩種值。Number是雙精度浮點(diǎn)數(shù),Lua中沒有整數(shù)類型。table類型可以當(dāng)作數(shù)組使用。
         在Lua中,變量默認(rèn)是全局的,這通常導(dǎo)致一些調(diào)試?yán)щy,最好盡量顯式的在變量名之前加上 local 關(guān)鍵字聲明該變量為局部變量。
  1. gNumber = 10  --這是一個默認(rèn)全局的變量  
  2. print(type(gNumber))  
  3. --輸出結(jié)果為number  
  4. gNumber = nil --之前的number類型gNumber = 10變量被釋放  
  5. print(type(gNumber))  
  6. --輸出結(jié)果為nil  
  7.   
  8. function LocalVarFunction ()  
  9.   local pTable = {} --用local關(guān)鍵字聲明一個局部變量,這個變量將在執(zhí)行LocalVarFunction方法后銷毀  
  10.      for idx = 1, 5 do   
  11.            local result = true  --這個result將在每個for循環(huán)執(zhí)行之后銷毀  
  12.            if result then   
  13.               local pString = "這個字符串將在if代碼塊之后銷毀"  
  14.               pTable[idx] = pString  
  15.               print(pTable[idx])  
  16.            end  
  17.      end  
  18. end  

      下面詳細(xì)介紹string以及table兩種類型的詳細(xì)用法。
1、string類型的用法
       Lua中的字符串操作非常出色。下表是一些特殊意義的字符:
特殊的Lua字符串
 字符 意義 字符 意義
     \a 響鈴     \v  垂直制表符 
    \b 退格     \\ 反斜杠
    \f 換頁符     \“ 雙引號
    \n 換行符     \' 單引號
    \r 換行符    \[ 左方括號
   \t 制表符    \] 右方括號
     a、類型轉(zhuǎn)換
     Lua會根據(jù)上下文在合理合法的情況下隱式進(jìn)行數(shù)字和字符之間的轉(zhuǎn)換。另外,也可以使用tonumber()函數(shù)和tostring()函數(shù)顯式地進(jìn)行字符與數(shù)字的轉(zhuǎn)換。 見代碼實(shí)例:
  1. --字符與數(shù)字的隱式轉(zhuǎn)換  
  2. print("10" + 7)  
  3. --輸出結(jié)果為:17,將字符10隱私轉(zhuǎn)化為Number類型計(jì)算  
  4. print("hello" + 7)  
  5. --無法進(jìn)行運(yùn)算,即不能隱式將"hello"字符轉(zhuǎn)化為Number計(jì)算  
  6. --[[  
  7.    系統(tǒng)錯誤如下:  
  8. stdin:1: attempt to perform arithmetic on a string value    
  9. stack traceback:    
  10.     stdin:1: in main chunk    
  11.     [C]: ?    
  12. --]]  
  13.   
  14.   
  15.   
  16. --字符與數(shù)字的顯式轉(zhuǎn)換  
  17. print(tonumber("100")+11)  
  18. --輸出結(jié)果為:111  
  19. print(type(tostring(100)))  
  20. --輸出結(jié)果為:string  
      b、常用的字符處理函數(shù)介紹    string.char()函數(shù)根據(jù)傳入的ASCII編碼返回該編碼對應(yīng)的字符。如:string.char(10),表示字符換行符,10是換行符的ASCII編碼。    
    string.len()函數(shù)求字符串的長度。如:
  1. print(string.len("hello"))  
  2. --輸出結(jié)果為:5  
   string.sub(aString, start, end) 函數(shù)返回指定字符串的子串。如:
  1. gString = "hello Lua"  
  2. print(string.sub(gString, 7,9))  
  3. --輸出結(jié)果為:Lua  
    string.format()函數(shù)格式化輸出指定字符串。%s表示字符串,%d表示所有數(shù)字,%D表示非數(shù)字,%a表示字母,%c表示控制字符,%l小寫字母,%p標(biāo)點(diǎn)符號,%s空格符號,%u大寫字母,%w字母數(shù)字,%x十六進(jìn)制數(shù),%z用0表示的字符。加%前綴可以讓特殊符號也能用在格式化中(如:().%+_*?[ ^ $ ]),如%%代表百分比符號。%.4f表示小數(shù)點(diǎn)后有4位的浮點(diǎn)數(shù),%02d.表示至少有兩個數(shù)字的整數(shù),如果不足兩個數(shù)字則用0補(bǔ)足。如:
  1. aString = "哈哈,你是"  
  2. bString = "一頭豬"  
  3. print(string.format("%s%s", aString, bString))  
  4. --輸出結(jié)果為:哈哈,你是一頭豬  
     sting.find(sourceString, targetString) 函數(shù)在sourceString字符串中查找第一個符合targetString字符串的位置,如果找到則返回開始和結(jié)束的位置,沒找到則返回nil。
     string.gsub(sourceString, pattern, replacementString) 函數(shù)返回一個字符串,sourceString字符中滿足pattern格式的字符都會被替換成replacementString參數(shù)的值。

     string.gfind(sourceString, pattern) 函數(shù)遍歷一個字符串,一旦查找到符合指定格式的字符串就返回該子串。

2、table類型的用法

     一般table可以當(dāng)做數(shù)組使用,可以通過table[n]的索引形式訪問任意數(shù)組中的某個成員。在Lua中,table還能被當(dāng)做字典dictionary數(shù)據(jù)使用,并且數(shù)組跟字典的用法還能混合使用(實(shí)質(zhì)上還是數(shù)組,只不過索引從數(shù)字變成其他屬性值)。
     a、使用其他值作為table的索引以及多維table
      table還可以使用其他的值作為索引值,并且能用數(shù)字跟其他值同時作為同一個table的索引。如:
  1. gTable = {}  
  2. gTable.name = "eric"  
  3. gTable.gender = "man"  
  4. gTable.phonenumber = "0000000000"  
  5. gTable[1] = "公司"  
  6. gTable[2] = "部門"  
  7. for index, value in pairs(gTable) do   
  8.   print(index, value)  
  9. end  
  10. --[[  
  11. 輸出結(jié)果如下:  
  12. 1   公司  
  13. 2   部門  
  14. phonenumber 0000000000  
  15. gender  man  
  16. name    eric  
  17. --]]  
      注意,上述循環(huán)中的pairs()函數(shù)可以遍歷table中的每一對值(索引以及索引對應(yīng)的value,有點(diǎn)類似字典,不是嗎?)
      事實(shí)上,table的索引還可以是table本身,這樣就組成了一個多維table或多維字典。跟其他語言的多維數(shù)組或字典比起來,使用真是超級方便,非常非常的靈活。如:
  1. gTable = {}  
  2. gTable.name = "eric"  
  3. gTable.gender = "man"  
  4. gTable.phonenumber = "0000000000"  
  5. gTable[1] = "公司"  
  6. gTable[2] = "部門"  
  7. gTable.hobby = {"跑步", "讀書", "游戲", "動漫"}  -- 多維table,可以通過gTable.hobby[1]的方式訪問.即gTable.hobby本身也是一個table  
  8. gTable.secTable = {}  
  9. gTable.secTable.job = "程序員"  
  10. gTable.secTable.label = "寫代碼的"  
  11. gTable.secTable.description = "職責(zé)是實(shí)現(xiàn)產(chǎn)品的邏輯"  
  12.   
  13. for index, value in pairs(gTable) do   
  14.   print(index, value)  
  15.   if ("table" == type(value)) then  
  16.      for idx, var in pairs(value) do   
  17.          print("二維table:", idx, var)  
  18.      end  
  19.    end  
  20. end  
  21. --[[  
  22. 輸出結(jié)果如下:  
  23. 1   公司  
  24. 2   部門  
  25. hobby   table: 0x7fdceac14bc0  
  26. 二維table:    1   跑步  
  27. 二維table:    2   讀書  
  28. 二維table:    3   游戲  
  29. 二維table:    4   動漫  
  30. phonenumber 0000000000  
  31. gender  man  
  32. secTable    table: 0x7fdceac15100  
  33. 二維table:    label   寫代碼的  
  34. 二維table:    description 職責(zé)是實(shí)現(xiàn)產(chǎn)品的邏輯  
  35. 二維table:    job 程序員  
  36. name    eric  
  37. --]]  

     b、table 的常用函數(shù)
      table.getn()函數(shù),返回table中元素的個數(shù)。如:
  1. gStringTable = {"a", "b","c","d","e"}  
  2. for i = 1, table.getn(gStringTable) do  
  3.      print(gStringTable[i])  
  4. end  
     table.sort()函數(shù),將table中的元素從小到大排列。如:
  1. gNumberTable = {10, 5, 7, 2,3, 2}  
  2. table.sort(gNumberTable)  
  3. for i = 1, table.getn(gNumberTable) do   
  4.    print(gNumberTable[i])  
  5. end  
  6. --輸出結(jié)果如下:  
  7. 2  
  8. 2  
  9. 3  
  10. 5  
  11. 7  
  12. 10  
    table.insert(pTable, position, value) 函數(shù)在table中插入一個新值,位置參數(shù)如果沒指定,則默認(rèn)將新值插入到table的末尾。
    table.remove(pTable, position) 函數(shù)從指定table中刪除指定位置的元素并返回該元素,如果沒有指定刪除的位置,則默認(rèn)刪除table的最后一個元素。
   介紹到這里, Lua中基本的數(shù)據(jù)類型諸位應(yīng)該都能掌握,休息一下,下面接著開始簡單介紹Lua的基本語句以及函數(shù)。

二、Lua中的常用語句結(jié)構(gòu)以及函數(shù)

 1、Lua中的常用語句結(jié)構(gòu)介紹

  1. --if 語句結(jié)構(gòu),如下實(shí)例:  
  2. gTable = {"hello", 10}  
  3. if nil ~= gTable[1] and "hello" == gTable[1] then  
  4.   print("gTable[1] is" , gStringTable[1])  
  5. elseif  10 == gTable[2] then  
  6.   print("gTable[2] is", gTable[2])  
  7. else   
  8.   print("unkown gTable element")  
  9. end  

  1. --while 和repeat循環(huán)語句結(jié)構(gòu),while先判斷條件,如果true才執(zhí)行代碼塊(有可能跳過該代碼塊);repeat則是在最后判斷條件,保證代碼塊至少執(zhí)行一次。  
  2. gTable = {1,2,3,4,5,6,7,8,9,10}  
  3. index = 1  
  4. while gTable[index] < 10 do   
  5.    print("while gTable[",index,"] is ",gTable[index])  
  6.    index = index + 1 -- 注意,Lua不支持index++或者index += 1形式的運(yùn)算符。  
  7. end  
  8. --[[  
  9. while循環(huán)輸出結(jié)果如下:  
  10. while gTable[   1   ] is    1  
  11. while gTable[   2   ] is    2  
  12. while gTable[   3   ] is    3  
  13. while gTable[   4   ] is    4  
  14. while gTable[   5   ] is    5  
  15. while gTable[   6   ] is    6  
  16. while gTable[   7   ] is    7  
  17. while gTable[   8   ] is    8  
  18. while gTable[   9   ] is    9  
  19. --]]  
  20.   
  21. --上一個循環(huán)結(jié)束后,index = 10  
  22. repeat  
  23.     print("repeat gTable[",index,"] is ",gTable[index])  
  24.    index = index - 2  
  25. until index < 1  
  26. --[[  
  27. 輸出結(jié)果如下:  
  28. repeat gTable[  10  ] is    10  
  29. repeat gTable[  8   ] is    8  
  30. repeat gTable[  6   ] is    6  
  31. repeat gTable[  4   ] is    4  
  32. repeat gTable[  2   ] is    2  
  33. --]]  

  1. --for循環(huán)結(jié)構(gòu),for循環(huán)結(jié)構(gòu)具有三個參數(shù),初始值,結(jié)束值,每個循環(huán)增加值。  
  2. for index = 1, 5 do --不設(shè)置第三個參數(shù)的話,默認(rèn)缺省第三個參數(shù)是1,即每個循環(huán) index 增加1  
  3.    print("for cycle index =",index)  
  4. end  
  5. --[[  
  6. 輸出結(jié)果為:  
  7. for cycle index =   1  
  8. for cycle index =   2  
  9. for cycle index =   3  
  10. for cycle index =   4  
  11. for cycle index =   5  
  12. --]]  
  13.   
  14. for index = 20 , 0, -5 do --設(shè)定第三個參數(shù)為-5  
  15.  print("for cycle index:",index)  
  16. end  
  17. --[[  
  18. 輸出結(jié)果:  
  19. for cycle index:    20  
  20. for cycle index:    15  
  21. for cycle index:    10  
  22. for cycle index:    5  
  23. for cycle index:    0  
  24. --]]  

  1. --break關(guān)鍵字可以使循環(huán)強(qiáng)制退出,Lua中沒有continue關(guān)鍵字,需要通過其他方式實(shí)現(xiàn)continue關(guān)鍵字,比如if-else語句?;蛘咄ㄟ^網(wǎng)絡(luò)下載Lua的continue關(guān)鍵字補(bǔ)丁安裝來解決該問題  
  2.   
  3. for index = 1, 100, 5 do   
  4.   if index > 10 and index < 25 then  --用if-else語句實(shí)現(xiàn)continue關(guān)鍵字的功能  
  5.      print("continue!!!!! index=",index)  
  6.   else   
  7.     if index > 15 and index < 35 then   
  8.        print("break~~~~~index=",index)  
  9.        break  
  10.     end  
  11.     print("At end index=",index)  
  12.   end  
  13. end  
  14.   
  15. --[[  
  16. 輸出結(jié)果如下:  
  17. At end index=   1  
  18. At end index=   6  
  19. continue!!!!! index=    11  
  20. continue!!!!! index=    16  
  21. continue!!!!! index=    21  
  22. break~~~~~index=    26  
  23. --]]  

  1. --最后還要提的一點(diǎn)是,Lua中switch語句的缺失,用if-elseif-else語句代替的話,顯得非常臃腫,還有其他的一些實(shí)現(xiàn)方案。筆者在網(wǎng)上麥子加菲童鞋的博客中找到一種Lua中代替switch語句非常優(yōu)雅的方案。下面貼出麥子加菲原代碼:  
  2. --Switch語句的替代語法(所有替代方案中覺得最好,最簡潔,最高效,最能體現(xiàn)Lua特點(diǎn)的一種方案)  
  3. action = {    
  4.   [1] = function (x) print(x) end,    
  5.   [2] = function (x) print( 2 * x ) end,    
  6.   ["nop"] = function (x) print(math.random()) end,    
  7.   ["my name"] = function (x) print("fred") end,    
  8. }    
  9.    
  10. while true do    
  11.     key = getChar()    
  12.     x = math.ramdon()    
  13.     action[key](x)    
  14. end   

2、Lua中的函數(shù)
     在Lua腳本中,函數(shù)是以function關(guān)鍵字開始,然后是函數(shù)名稱,參數(shù)列表,最后以end關(guān)鍵字表示函數(shù)結(jié)束。需要注意的是,函數(shù)中的參數(shù)是局部變量,如果參數(shù)列表中存在(...)時,Lua內(nèi)部將創(chuàng)建一個類型為table的局部變量arg,用來保存所有調(diào)用時傳遞的參數(shù)以及參數(shù)的個數(shù)(arg.n)。
  1. function PrintTable (pTable)  
  2.   for index = 1, table.getn(pTable) do   
  3.       print("pTable[",index,"] =",pTable[index])  
  4.   end  
  5. end  
  6.   
  7. gStringTable = {"hello","how","are","you"}  
  8. PrintTable(gStringTable)  
  9. --[[  
  10. 輸出結(jié)果為:  
  11. pTable[ 1   ] = hello  
  12. pTable[ 2   ] = how  
  13. pTable[ 3   ] = are  
  14. pTable[ 4   ] = you  
  15. --]]  
  16.   
  17. function PrintFriendInfo (name, gender, ...)   
  18.   local friendInfoString = string.format("name:%s  gender:%d",name,gender)  
  19.   if 0 < arg.n then  
  20.      for index = 1, arg.n do   
  21.         friendInfoString = string.format("%s otherInfo:%s",friendInfoString, arg[index])  
  22.      end  
  23.    end  
  24.    print(friendInfoString)  
  25. end  
  26.   
  27.   
  28. PrintFriendInfo ("eric", 1, "程序員","2b", 50)  
  29.   
  30.  --輸出結(jié)果為:  
  31. -- name:eric  gender:1 otherInfo:程序員 otherInfo:2b otherInfo:50  

      Lua函數(shù)的返回值跟其他語言比較的話,特殊的是能夠返回多個返回值。return之后,該Lua函數(shù)從Lua的堆棧里被清理。
  1. function GetUserInfo ()  
  2.     local name = "eric"  
  3.     local gender = 1  
  4.     local hobby = "動漫"  
  5.   return name, gender, hobby  
  6. end  
  7.   
  8. print(GetUserInfo())  
  9.   
  10. --輸出結(jié)果:eric 1   動漫  


三、Lua中的庫函數(shù)

          在本文的最后,介紹一些Lua中常用的庫函數(shù)。
          1.數(shù)學(xué)庫
          math庫的常用函數(shù):三角函數(shù)math.sin、math.cos、取整函數(shù)math.floor、math.ceil、math.max、math.min、隨機(jī)函數(shù)math.random、math.randomseed(os.time())、變量pi和huge。
          2、I/O庫
         進(jìn)行I/O操作前,必須先用io.open()函數(shù)打開一個文件。io.open()函數(shù)存在兩個參數(shù),一個是要打開的文件名,另一個是模式字符,類似"r"表示讀取、“w”表示寫入并同時刪除文件原來內(nèi)容,“a”表示追加,“b”表示打開二進(jìn)制文件。該函數(shù)會返回一個表示文件的返回值,如果打開出錯則返回nil,寫入之前需要判斷是否出錯,比如:local file = assert(io.open(filename, “w”))..使用完畢后,調(diào)用io.close(file).或file:close()。
       幾個常用I/O函數(shù):io.input ()、io.output ()、 io.read()、 io.write()。
  1. local file = assert(io.open(filename, “w”))  
  2. if file ~= nil then  
  3.   file:write("hello lua!!!!")  --注意,等同于io.write("hello lua!!!!")  
  4.   file:close()  --等同于io.close(file)  
  5. end  

         3、調(diào)試庫

         debug.getinfo()函數(shù),他的第一個參數(shù) 可以是一個函數(shù)或一個棧層。返回結(jié)果是一個table,其中包含了函數(shù)的定義位置、行號、函數(shù)類型、函數(shù)名稱等信息。

         debug.getlocal()函數(shù)檢查函數(shù)任意局部變量,有兩個參數(shù),第一個是希望查詢的函數(shù)棧層,另一個是變量的索引。

         assert(trunk)() 函數(shù),執(zhí)行參數(shù)中代碼塊并在出錯時提供報(bào)錯功能

  1. a = "hello world"  
  2. b = "print(a)"  
  3. assert(loadstring(b))()  
  4. --輸出結(jié)果:  
  5. hello world  

        4、幾個處理Lua碼塊的函數(shù)

        loadstring(pString)()函數(shù)可以直接執(zhí)行pString字符串組成的Lua碼,但不提供報(bào)錯功能。

  1. loadstring("for index = 1, 4 do print(\"for cycle index =\",index) end")()  
  2. --[[  
  3. 輸出結(jié)果  
  4. for cycle index =   1  
  5. for cycle index =   2  
  6. for cycle index =   3  
  7. for cycle index =   4  
  8. --]]  

      dofile(filename)函數(shù)的功能是載入并立刻執(zhí)行Lua腳本文件??梢杂脕?/span>載入定義函數(shù)的文件或者數(shù)據(jù)文件、或立即執(zhí)行的Lua碼。dofile函數(shù)會將程序的執(zhí)行目錄作為當(dāng)前目錄。如果要載入程序執(zhí)行目錄的子目錄里的文件,需要加上子目錄的路徑。
  1. dofile("/Users/ericli/WorkSpace/Lua語言/hellolua.lua")  
  2. --輸出結(jié)果:Hello Lua!  
        本篇總結(jié)完畢,本篇只是總結(jié)了Lua的一些最基本的語法。至于Lua的更高級的內(nèi)容,比如:協(xié)同程序、模塊與包、Lua調(diào)用C碼、C++Lua的整合等,還需要在以后的學(xué)習(xí)過程中深入。


參考資料:

解決Lua語法缺失及替代措施

書籍:《Lua程序設(shè)計(jì)》、《Lua戲開發(fā)實(shí)踐指南》


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多