最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Lua學(xué)習(xí)筆記之類型與值

 更新時(shí)間:2015年04月10日 11:05:58   投稿:hebedich  
本文詳細(xì)的總結(jié)了Lua中的類型與值,對(duì)于實(shí)際編程中容易出錯(cuò)的地方也進(jìn)行了詳細(xì)的總結(jié),十分的全面實(shí)用。有需要的小伙伴可以參考下。

基礎(chǔ)介紹

Lua是一種動(dòng)態(tài)類型的語(yǔ)言。在語(yǔ)言中沒(méi)有類型定義的語(yǔ)法,每個(gè)值都帶有其自身的類型信息。在Lua中有8種基本類型,分別是:

nil(空)類型

boolean(布爾)類型

number(數(shù)字)類型

string(字符串)類型

userdata(自定義類型)

function(函數(shù))類型

thread(線程)類型

table(表)類型

以上是Lua中的8中基本類型,我們可以使用type函數(shù),判斷一個(gè)值得類型,type函數(shù)返回一個(gè)對(duì)應(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是一種類型,它只有一個(gè)值nil。一個(gè)全局變量在第一次賦值前的默認(rèn)值就是nil,將nil賦予一個(gè)全局變量等同于刪除它。Lua將nil用于表示一種“無(wú)效值”的情況,即沒(méi)有任何有效值得情況。

boolean(布爾)

boolean類型有兩個(gè)可選值:false和true。一定需要注意的是,在Lua中只有false和nil是“假”的,而除此之外的都是“真”,這和其它語(yǔ)言有所區(qū)別的。我之前有一個(gè)同事,就吃過(guò)這個(gè)虧。

number(數(shù)字)

number類型用于表示雙精度浮點(diǎn)數(shù)。Lua沒(méi)有整數(shù)類型,而Lua中的數(shù)字可以表示任何32位整數(shù)。

string(字符串)

Lua中的字符串通常表示“一個(gè)字符序列”。Lua完全采用8位編碼。Lua的字符串是不可變的值。不能像C語(yǔ)言中那樣直接修改字符串的某個(gè)字符,而是應(yīng)該根據(jù)修改要求來(lái)創(chuàng)建一個(gè)新的字符串。Lua的字符串和其它對(duì)象都是自動(dòng)內(nèi)存管理機(jī)制所管理的對(duì)象,不需要擔(dān)心字符串的內(nèi)存分配和釋放。在Lua中,字符串可以高效的處理長(zhǎng)字符串。當(dāng)字符串是多行存在時(shí),可以使用“[[]]”符號(hào)來(lái)界定一個(gè)多行字符串,同時(shí),Lua不會(huì)解釋其中的轉(zhuǎn)義序列。例如:

local page = [[
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>xxxx</title>
</head>
<body>
</body>
</html>
]]
print(page)

table(表)

table類型實(shí)現(xiàn)了關(guān)聯(lián)數(shù)組,關(guān)聯(lián)數(shù)組是一種具有特殊索引方式的數(shù)組;不僅可以通過(guò)整數(shù)來(lái)索引它,還可以使用字符串或其它類型的值(除了nil)來(lái)索引它。此外,table沒(méi)有固定的大小,可以動(dòng)態(tài)得添加任意數(shù)量的元素到一個(gè)table中。

在Lua中,table既不是“值”,也不是“變量”,而是對(duì)象。可以將table想象成一種動(dòng)態(tài)分配的對(duì)象,程序中僅僅有一個(gè)隊(duì)它們的引用(指針)。table的創(chuàng)建是通過(guò)“構(gòu)造表達(dá)式”完成的,最簡(jiǎn)單的構(gòu)造表達(dá)式就是{}。

table永遠(yuǎn)是匿名的,一個(gè)引用table的變量與table自身之間沒(méi)有固定的關(guān)聯(lián)性,例如以下代碼:

local a = {} -- 創(chuàng)建一個(gè)table,并將它的引用存儲(chǔ)在a
a["x"] = 10
local b = a -- b與a引用同一個(gè)table
print(b["x"])
b["x"] = 20
print(a["x"])

b = nil -- 現(xiàn)在只有a還在引用table
-- 錯(cuò)誤:print(b["x"])
print(a["x"])
a = nil -- 現(xiàn)在不存在對(duì)table的引用

當(dāng)對(duì)一個(gè)table的引用為0時(shí),Lua的垃圾收集器最終會(huì)刪除該table,并釋放它所占用的內(nèi)存空間。當(dāng)table的某個(gè)元素沒(méi)有初始化時(shí),它的內(nèi)容就是nil;另外還可以像全局變量一樣,將nil賦予table的某個(gè)元素來(lái)刪除該元素。

在Lua中,對(duì)于a["name"]這種形式的寫法提供了一種更簡(jiǎn)便的寫法,可以直接輸入a.name。先看看以下代碼:

local a = {} -- 創(chuàng)建一個(gè)table,并將它的引用存儲(chǔ)在a
a["x"] = 10
local b = a -- b與a引用同一個(gè)table
print(b["x"])
b["x"] = 20
print(a["x"])

b = nil -- 現(xiàn)在只有a還在引用table
-- 錯(cuò)誤:print(b["x"])
print(a["x"])
a = nil -- 現(xiàn)在不存在對(duì)table的引用

這種寫法本身提供了簡(jiǎn)便性,但是有的時(shí)候,卻給程序員帶來(lái)了困惑;我就常常會(huì)把a(bǔ).x和a[x]搞錯(cuò),a.x表示a["x"],表示以字符串”x”來(lái)索引table;而a[x]是以變量x的值來(lái)索引table。通過(guò)下面這段代碼,來(lái)看看它們之間的區(qū)別:

local a = {}
a["name"] = 10
print(a.name) -- 等價(jià)于print(a["name"])

在Lua 5.1中,長(zhǎng)度操作符“#”用于返回一個(gè)數(shù)組或線性表的最后一個(gè)索引值。在實(shí)際項(xiàng)目中,我們經(jīng)常使用該操作符來(lái)獲取數(shù)組或線性表的長(zhǎng)度。但是使用該操作符是存在陷阱的,比如下面一段代碼:

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中,對(duì)于所有未初始化的元素的索引結(jié)果都是nil。Lua將nil作為界定數(shù)組結(jié)尾的標(biāo)志。當(dāng)一個(gè)數(shù)組有“空隙”時(shí),即中間含有nil時(shí),長(zhǎng)度操作符會(huì)認(rèn)為這些nil元素就是結(jié)尾標(biāo)記。因?yàn)閍[1] = nil,所以,對(duì)于上述代碼的輸出應(yīng)該是0。所以,在處理table的時(shí)候,需要考慮這個(gè)問(wèn)題。那么對(duì)于含有nil的table,如何獲取它的長(zhǎng)度呢?我們可以使用table.maxn,它將返回一個(gè)table的最大正索引數(shù),如下所示:

local a = {}
a[1000] = 1
print(table.maxn(a)) -->1000

function(函數(shù))

在Lua中,函數(shù)被當(dāng)做值來(lái)對(duì)待,這表示函數(shù)可以存儲(chǔ)在變量中,可以通過(guò)參數(shù)傳遞給其它函數(shù),還可以作為其它函數(shù)的返回值。Lua既可以調(diào)用自身Lua語(yǔ)言編寫的函數(shù),又可以調(diào)用以C語(yǔ)言編寫的函數(shù)。Lua所有的標(biāo)準(zhǔn)庫(kù)都是用C語(yǔ)言寫的。我在之后,還會(huì)詳細(xì)的總結(jié)Lua中的函數(shù)的。在這里就說(shuō)這么多。

userdata(自定義類型)和thread(線程)

userdata用于表示一種由應(yīng)用程序或C語(yǔ)言庫(kù)所創(chuàng)建的新類型。由于userdata類型可以將任意的C語(yǔ)言數(shù)據(jù)存儲(chǔ)到Lua變量中。在Lua中,這種類型沒(méi)有太多的預(yù)定義操作,只能進(jìn)行賦值和相等性測(cè)試。

thread主要用于“協(xié)同程序”。

總結(jié)

這篇基本就是Lua基本類型的掃盲文章,希望對(duì)大家有點(diǎn)用。

以上所述就是本文的全部?jī)?nèi)容了,希望能夠?qū)Υ蠹覍W(xué)習(xí)lua語(yǔ)言有所幫助。

相關(guān)文章

  • openresty中使用lua-nginx創(chuàng)建socket實(shí)例

    openresty中使用lua-nginx創(chuàng)建socket實(shí)例

    這篇文章主要介紹了openresty中使用lua-nginx創(chuàng)建socket實(shí)例,本文直接給出代碼實(shí)例和運(yùn)行效果,需要的朋友可以參考下
    2015-04-04
  • 淺析C\C++和Lua的通信方式

    淺析C\C++和Lua的通信方式

    lua作為小巧精悍的腳本語(yǔ)言,易于嵌入c/c++中 , 廣泛應(yīng)用于游戲AI ,實(shí)際上在任何經(jīng)常變化的邏輯上都可以使用lua實(shí)現(xiàn),配合c/c++實(shí)現(xiàn)的底層接口服務(wù),能夠大大降低系統(tǒng)的維護(hù)成本。
    2014-09-09
  • C++中調(diào)用Lua函數(shù)實(shí)例

    C++中調(diào)用Lua函數(shù)實(shí)例

    這篇文章主要介紹了C++中調(diào)用Lua函數(shù)實(shí)例,本文給出了Lua和C++的代碼,并對(duì)步驟做了講解,需要的朋友可以參考下
    2014-09-09
  • Lua中table里內(nèi)嵌table的例子

    Lua中table里內(nèi)嵌table的例子

    這篇文章主要介紹了Lua中table里內(nèi)嵌table的例子,本文同時(shí)講解了如何訪問(wèn)內(nèi)嵌table方法的例子,需要的朋友可以參考下
    2015-04-04
  • Lua學(xué)習(xí)筆記之?dāng)?shù)據(jù)類型

    Lua學(xué)習(xí)筆記之?dāng)?shù)據(jù)類型

    這篇文章主要介紹了Lua學(xué)習(xí)筆記之?dāng)?shù)據(jù)類型,本文同時(shí)講解了開(kāi)發(fā)環(huán)境的搭建,需要的朋友可以參考下
    2014-09-09
  • Lua編程示例(六): C語(yǔ)言調(diào)用Lua函數(shù)

    Lua編程示例(六): C語(yǔ)言調(diào)用Lua函數(shù)

    這篇文章主要介紹了Lua編程示例(六): C語(yǔ)言調(diào)用Lua函數(shù),本文直接給出代碼實(shí)例,需要的朋友可以參考下
    2015-07-07
  • 使用lua實(shí)現(xiàn)split字符串分隔

    使用lua實(shí)現(xiàn)split字符串分隔

    Lua腳本可以很容易的被C/C++代碼調(diào)用,也可以反過(guò)來(lái)調(diào)用C/C++的函數(shù),這使得Lua在應(yīng)用程序中可以被廣泛應(yīng)用。不僅僅作為擴(kuò)展腳本,也可以作為普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和維護(hù)。
    2014-11-11
  • Lua變量類型簡(jiǎn)明總結(jié)

    Lua變量類型簡(jiǎn)明總結(jié)

    這篇文章主要介紹了Lua變量類型簡(jiǎn)明總結(jié),本文總結(jié)了Lua中的6種變量類型,并一一說(shuō)明,需要的朋友可以參考下
    2014-10-10
  • Lua腳本語(yǔ)言簡(jiǎn)明入門教程

    Lua腳本語(yǔ)言簡(jiǎn)明入門教程

    這篇文章主要介紹了Lua腳本語(yǔ)言簡(jiǎn)明入門教程,本文簡(jiǎn)潔干練,可以讓一個(gè)有編程基礎(chǔ)的快速的學(xué)會(huì)Lua腳本語(yǔ)言,需要的朋友可以參考下
    2014-09-09
  • Lua中寫排序算法實(shí)例(選擇排序算法)

    Lua中寫排序算法實(shí)例(選擇排序算法)

    這篇文章主要介紹了Lua中寫排序算法實(shí)例,本文用一個(gè)選擇排序算法為例講解如何在Lua中寫一個(gè)排序算法,需要的朋友可以參考下
    2015-04-04

最新評(píng)論

齐河县| 长寿区| 龙泉市| 罗田县| 三明市| 龙南县| 垫江县| 巫溪县| 平定县| 五台县| 华池县| 岳西县| 石嘴山市| 镇远县| 应用必备| 行唐县| 吴川市| 华蓥市| 湖口县| 云霄县| 丹寨县| 绥化市| 图木舒克市| 连山| 绩溪县| 运城市| 增城市| 苗栗市| 灌南县| 南昌市| 九龙县| 渑池县| 驻马店市| 郯城县| 旬阳县| 亚东县| 崇义县| 六盘水市| 德兴市| 七台河市| 出国|