標籤:style blog http color 使用 os strong io
簡單認識Lua
百度了一下(偷哈懶就不自己寫了)
Lua 是一個小巧的指令碼語言。是巴西裡約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro)裡的一個研究小組,
由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所組成並於1993年開發。 其設計目的是為了嵌入應用程式中,
從而為應用程式提供靈活的擴充和定製功能。Lua由標準C編寫而成,幾乎在所有作業系統和平台上都可以編譯,運行。Lua並沒有提供強大的庫,
這是由它的定位決定的。所以Lua不適合作為開發獨立應用程式的語言。Lua 有一個同時進行的JIT項目,提供在特定平台上的即時編譯功能。
命名規範:Lua採用了和CSharp類似的命名規範由任意字母、數字和底線構成,但不能以數字開頭。原則上不使用底線加大寫字母變數名稱。當然也不能使用Lua關鍵字,而且Lua也是卻分大小寫。關鍵字如下:
| and |
break |
do |
else |
elseif |
end |
false |
| for |
function |
if |
in |
local |
nil |
not |
| or |
repeat |
return |
then |
true |
until |
while |
注釋:行注釋使用兩個連字號(--);多行注釋有兩種大同小異以”--[[“開始,以”--]]”結尾或者以”--[==[”開始以” –]==]”結尾中間的等號可以任意多個但前後要匹配。
全域變數:Lua中的全域變數比較特殊,不需要聲明直接使用即可,沒有給值得到的久是nil值。刪除全域變數直接給他nil就刪除。
資料類型
Lua是一種動態類型的語言,沒有類型定義文法;也就是說一個Lua變數既可以儲存數字類型的值也可以儲存字串類型的值或者其他類型。但通常我們不這樣幹,因為很容易混淆。Lua定義了8中基礎類型
| 類型 |
名稱 |
類型 |
名稱 |
| nil |
空 |
boolean |
布爾 |
| number |
數字 |
string |
字串 |
| userdata |
自訂類型 |
function |
函數 |
| thread |
線程 |
table |
表 |
Lua中擷取變數類型也比較簡單實用type函數即可。寫一段代碼測試先:
print(a) -- a的值為nilprint(type(tmp)) -- tmp的值為nil但這裡不是列印它的值,而是值的類型tmp = 3 -- 給tmp賦值整數3print(type(tmp)) --> numbertmp = 3.14 -- 給tmp賦值浮點數print(type(tmp)) --> numbertmp = print -- 將函數print賦值給tmpprint(type(tmp)) --> functiontmp = true print(type(tmp)) --> booleantmp = nil -- 給全域變數nil值相當於刪除print(type(tmp)) --> nil
上面代碼很簡單也有注釋很容易看懂就不再解釋。
布爾類型:布爾類型主要用於分支結構中判斷真與假。Lua在條件測試時只有兩個值認為是假:false和nil,其他任何值都認為是真包括數字零和Null 字元串。
數字類型:Lua中的數字類型來得相當簡潔沒有CSharp中的長短整型、單雙精確度浮點數,就一個number實數類型。
字串:Lua中的字串是不可變的值,也就是說不能在字串上直接修改。字面字串既可以使用雙引號也可以使用單引號,但建議統一一種風格。Lua中也支援逸出字元
| \a |
響鈴 |
\b |
退格 |
| \f |
提供表格 |
\n |
換行 |
| \r |
斷行符號 |
\t |
水平tab |
| \v |
垂直tab |
\\ |
反斜線 |
| \” |
雙引號 |
\’ |
單引號 |
除逸出字元外Lua也支援根據ASCII編碼將數字轉義為字元。另外可以使用兩對方括弧”[[””]]”一段字串,裡面的字串將不會被轉義。但兩對方括弧並不能處理所有情況比如字串中包含a=b[c[i]],這中情況可以想塊注釋那樣,在方括弧中間加任意的等號。
字串類型轉換:說到字串就不得不說字串與數字之間的類型轉換。在Lua中,Lua解譯器會根據上下文自動將字串轉換為數字或者將數字轉換為字串。還是看下面代碼的”類型轉換“部分:
a = "one string"b = ‘one‘print(a) --> one stringprint(b) --> oneb=string.gsub(a,"one","other") -- 執行字串替換 當然你也可以這樣寫a=string.gsub(a,"one","other")print(a) --> one stringprint(b) --> other string-------------------------------------ASCII 數字轉義----------------a = "hello worl\100"print(a) --> heloo world-----------------塊字串,不轉義內容-------------------a = [[ <html> <head>字串測試</head> <body><h1>http://home.cnblogs.com/u/BlueBeauty</h1> </body> </html>]]print(a)----------------------塊字串,處理極端情況----------------------------a = [===[ <html> <head>字串測試</head> <body><h1>http://home.cnblogs.com/u/BlueBeauty</h1><h2>a=b[c[i]]</h2> </body> </html>]===]print(a)---------------------類型轉換-----------------------------print("29" + 3) --> 32print("29 + 3") --> 29 + 3print("3.14"*"2.5") --> 7.85--print("hello"+8) 錯誤,Lua解釋為加法計算,但不能將hello轉換為數字print("hello"..8) --> hello8--print(10..20) 這句錯誤,使用串連操作符時,如果第一個運算元是數字需要使用空格隔開,如下面兩句print(10 .. 20) --> 1020print(10 ..30) --> 1030b = 10=="10"print(b) --> falseprint(10==tonumber("10")) --> trueprint(tostring(10)=="10") --> true-------------長度操作符的使用----------a = "hello"print(#a) --> 5print(#"hello worl\100 hjs") --> 15
表(table)類型:Lua中的表實現了”關聯陣列“,它能使用除nil以外的任何lua類型值來索引數組。對錶更準確的理解表應該是對象。使用一對大括弧{}來建立表,而且他總是匿名的。當沒有變數持有表的引用時,Lua將自動收回其記憶體。下面還是通過代碼來看看錶的具體操作:
-----------------------表建立於基本訪問------------------------a = {} --列印a的地址table: 004FC330(也就是引用) 建立一個表,沒有任何元素print(a)tmp = "hjs"a[tmp] = 123 --添加一個項目(key=hjs , value = 123),table會動態增加和全域變數類似a[10] = 20 --添加一個項目(key=10 , value = 20)print(a[tmp]) -->123print(a[10]) -->20b = a --將表引用賦值給bprint(a[tmp]) -->20 a[10] = 30 --修改表中元素的值print(a[10]) -->30-------------表訪問另一種文法---------------------------a.name = "xiaoyue"print(a.name) -->xiaoyueprint(a["name"]) -->xiaoyue 說明:這兩句都是訪問表中key為name的項目--------------擷取表大小--------------------------------a = {}a[100] = 20print(#a) --> 0 說明:Lua使用nil作為數組的結束標記,a[1]的值為nil所有這裡得到0 (Lua中下標通常從1開始)print(table.maxn(a)) --> 100 使用table.maxn函數可以很好的工作-------------表索引的資料類型轉換-----------------------i =10 ; j="10";k = "+10"a = {}a[i] = "one"a[j] = "two"a[k] = "other"print(a[i]) -->oneprint(a[j]) -->twoprint(a[k]) -->other 說明: i j k 三個變數都可以轉換為數字類型10 -- 但表訪問時並沒有做資料轉換,所有三個key不一樣print(a[tonumber(j)]) -->oneprint(a[tonumber(k)]) -->one
資料類型就先說到這裡吧,後面還有幾個函數等類型就放在以後說了。