Lua學(xué)習(xí)筆記之類型與值
基礎(chǔ)介紹
Lua是一種動態(tài)類型的語言。在語言中沒有類型定義的語法,每個值都帶有其自身的類型信息。在Lua中有8種基本類型,分別是:
nil(空)類型
boolean(布爾)類型
number(數(shù)字)類型
string(字符串)類型
userdata(自定義類型)
function(函數(shù))類型
thread(線程)類型
table(表)類型
以上是Lua中的8中基本類型,我們可以使用type函數(shù),判斷一個值得類型,type函數(shù)返回一個對應(yīng)類型的字符串描述。例如:
local iValue = 10 local fValue = 10.2 local strValue = "Hello World" local funcValue = print local bValue = true local nilValue = nil local tbValue = {} if type(iValue) == "number" then print("It is a number") end if type(fValue) == "number" then print("It is a number") end if type(strValue) == "string" then print("It is a string") end if type(funcValue) == "function" then print("It is a function") end if type(bValue) == "boolean" then print("It is a boolean") end if type(nilValue) == "nil" then print("It is a nil") end if type(tbValue) == "table" then print("It is a table") end nil(空)
nil是一種類型,它只有一個值nil。一個全局變量在第一次賦值前的默認(rèn)值就是nil,將nil賦予一個全局變量等同于刪除它。Lua將nil用于表示一種“無效值”的情況,即沒有任何有效值得情況。
boolean(布爾)
boolean類型有兩個可選值:false和true。一定需要注意的是,在Lua中只有false和nil是“假”的,而除此之外的都是“真”,這和其它語言有所區(qū)別的。我之前有一個同事,就吃過這個虧。
number(數(shù)字)
number類型用于表示雙精度浮點數(shù)。Lua沒有整數(shù)類型,而Lua中的數(shù)字可以表示任何32位整數(shù)。
string(字符串)
Lua中的字符串通常表示“一個字符序列”。Lua完全采用8位編碼。Lua的字符串是不可變的值。不能像C語言中那樣直接修改字符串的某個字符,而是應(yīng)該根據(jù)修改要求來創(chuàng)建一個新的字符串。Lua的字符串和其它對象都是自動內(nèi)存管理機制所管理的對象,不需要擔(dān)心字符串的內(nèi)存分配和釋放。在Lua中,字符串可以高效的處理長字符串。當(dāng)字符串是多行存在時,可以使用“[[]]”符號來界定一個多行字符串,同時,Lua不會解釋其中的轉(zhuǎn)義序列。例如:
local page = [[ <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>xxxx</title> </head> <body> </body> </html> ]] print(page)
table(表)
table類型實現(xiàn)了關(guān)聯(lián)數(shù)組,關(guān)聯(lián)數(shù)組是一種具有特殊索引方式的數(shù)組;不僅可以通過整數(shù)來索引它,還可以使用字符串或其它類型的值(除了nil)來索引它。此外,table沒有固定的大小,可以動態(tài)得添加任意數(shù)量的元素到一個table中。
在Lua中,table既不是“值”,也不是“變量”,而是對象。可以將table想象成一種動態(tài)分配的對象,程序中僅僅有一個隊它們的引用(指針)。table的創(chuàng)建是通過“構(gòu)造表達式”完成的,最簡單的構(gòu)造表達式就是{}。
table永遠(yuǎn)是匿名的,一個引用table的變量與table自身之間沒有固定的關(guān)聯(lián)性,例如以下代碼:
local a = {} -- 創(chuàng)建一個table,并將它的引用存儲在a a["x"] = 10 local b = a -- b與a引用同一個table print(b["x"]) b["x"] = 20 print(a["x"]) b = nil -- 現(xiàn)在只有a還在引用table -- 錯誤:print(b["x"]) print(a["x"]) a = nil -- 現(xiàn)在不存在對table的引用
當(dāng)對一個table的引用為0時,Lua的垃圾收集器最終會刪除該table,并釋放它所占用的內(nèi)存空間。當(dāng)table的某個元素沒有初始化時,它的內(nèi)容就是nil;另外還可以像全局變量一樣,將nil賦予table的某個元素來刪除該元素。
在Lua中,對于a["name"]這種形式的寫法提供了一種更簡便的寫法,可以直接輸入a.name。先看看以下代碼:
local a = {} -- 創(chuàng)建一個table,并將它的引用存儲在a a["x"] = 10 local b = a -- b與a引用同一個table print(b["x"]) b["x"] = 20 print(a["x"]) b = nil -- 現(xiàn)在只有a還在引用table -- 錯誤:print(b["x"]) print(a["x"]) a = nil -- 現(xiàn)在不存在對table的引用
這種寫法本身提供了簡便性,但是有的時候,卻給程序員帶來了困惑;我就常常會把a.x和a[x]搞錯,a.x表示a["x"],表示以字符串”x”來索引table;而a[x]是以變量x的值來索引table。通過下面這段代碼,來看看它們之間的區(qū)別:
local a = {} a["name"] = 10 print(a.name) -- 等價于print(a["name"])
在Lua 5.1中,長度操作符“#”用于返回一個數(shù)組或線性表的最后一個索引值。在實際項目中,我們經(jīng)常使用該操作符來獲取數(shù)組或線性表的長度。但是使用該操作符是存在陷阱的,比如下面一段代碼:
local a = {} x= "y" a[x] = 10 print(a[x]) -->10 相當(dāng)于a["y"] print(a.x) -->nil 相當(dāng)于a["x"] print(a.y) -->10 相當(dāng)于a["y"]
這該輸出多少呢?
在Lua中,對于所有未初始化的元素的索引結(jié)果都是nil。Lua將nil作為界定數(shù)組結(jié)尾的標(biāo)志。當(dāng)一個數(shù)組有“空隙”時,即中間含有nil時,長度操作符會認(rèn)為這些nil元素就是結(jié)尾標(biāo)記。因為a[1] = nil,所以,對于上述代碼的輸出應(yīng)該是0。所以,在處理table的時候,需要考慮這個問題。那么對于含有nil的table,如何獲取它的長度呢?我們可以使用table.maxn,它將返回一個table的最大正索引數(shù),如下所示:
local a = {} a[1000] = 1 print(table.maxn(a)) -->1000
function(函數(shù))
在Lua中,函數(shù)被當(dāng)做值來對待,這表示函數(shù)可以存儲在變量中,可以通過參數(shù)傳遞給其它函數(shù),還可以作為其它函數(shù)的返回值。Lua既可以調(diào)用自身Lua語言編寫的函數(shù),又可以調(diào)用以C語言編寫的函數(shù)。Lua所有的標(biāo)準(zhǔn)庫都是用C語言寫的。我在之后,還會詳細(xì)的總結(jié)Lua中的函數(shù)的。在這里就說這么多。
userdata(自定義類型)和thread(線程)
userdata用于表示一種由應(yīng)用程序或C語言庫所創(chuàng)建的新類型。由于userdata類型可以將任意的C語言數(shù)據(jù)存儲到Lua變量中。在Lua中,這種類型沒有太多的預(yù)定義操作,只能進行賦值和相等性測試。
thread主要用于“協(xié)同程序”。
總結(jié)
這篇基本就是Lua基本類型的掃盲文章,希望對大家有點用。
以上所述就是本文的全部內(nèi)容了,希望能夠?qū)Υ蠹覍W(xué)習(xí)lua語言有所幫助。
- Lua學(xué)習(xí)筆記之?dāng)?shù)據(jù)類型
- Lua學(xué)習(xí)筆記之運算符和表達式
- Lua學(xué)習(xí)筆記之表和函數(shù)
- Lua學(xué)習(xí)筆記之?dāng)?shù)據(jù)結(jié)構(gòu)
- Lua基礎(chǔ)教程之表(Table)學(xué)習(xí)筆記
- Lua基礎(chǔ)教程之賦值語句、表達式、流程控制、函數(shù)學(xué)習(xí)筆記
- Lua入門學(xué)習(xí)筆記
- Lua字符串庫(string庫)學(xué)習(xí)筆記
- Lua模塊與包學(xué)習(xí)筆記
- Lua面向?qū)ο缶幊虒W(xué)習(xí)筆記
- Lua中的閉包學(xué)習(xí)筆記
- Lua中的元表和元方法學(xué)習(xí)筆記
- Lua中的table學(xué)習(xí)筆記
- Lua 學(xué)習(xí)筆記之C API 遍歷 Table實現(xiàn)代碼
- Lua表達式和控制結(jié)構(gòu)學(xué)習(xí)筆記
相關(guān)文章
Openresty服務(wù)器使用lua腳本寫的Hello World簡單實例
這篇文章主要介紹了Openresty服務(wù)器使用lua腳本寫的Hello World簡單實例,OpenResty (也稱為 ngx_openresty)是一個全功能的 Web 應(yīng)用服務(wù)器。它打包了標(biāo)準(zhǔn)的 Nginx 核心,很多的常用的第三方模塊,以及它們的大多數(shù)依賴項,需要的朋友可以參考下2015-04-04Lua中實現(xiàn)php的strpos()以及strrpos()函數(shù)
這篇文章主要介紹了在Lua中實現(xiàn)php的strpos()以及strrpos()函數(shù)的方法,需要的朋友可以參考下2014-11-11實現(xiàn)Lua中數(shù)據(jù)類型的源碼分享
在Lua中有8種基礎(chǔ)類型,像其他動態(tài)語言一樣,在語言中沒有類型定義的語法,每個值都攜帶了它自身的類型信息。下面我們就來嘗試通過Lua 5.2.1的源碼來看類型的實現(xiàn)2015-04-04