国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

上海網(wǎng)站設(shè)計(jì)專業(yè)團(tuán)隊(duì)知乎推廣合作

上海網(wǎng)站設(shè)計(jì)專業(yè)團(tuán)隊(duì),知乎推廣合作,wordpress返回前頁,備案網(wǎng)查詢文章目錄 官方唯一指定數(shù)據(jù)結(jié)構(gòu)--tabletable的一萬種用法字典和數(shù)組 迭代器ipairs()pairs() 回到Table 在【Lua學(xué)習(xí)筆記】Lua入門中我們講到了Lua的一些入門知識(shí)點(diǎn),本文將補(bǔ)充Lua的一些進(jìn)階知識(shí) 官方唯一指定數(shù)據(jù)結(jié)構(gòu)–table 在上篇文章的最后,我們指出…

在這里插入圖片描述

文章目錄

  • 官方唯一指定數(shù)據(jù)結(jié)構(gòu)--table
    • table的一萬種用法
      • 字典和數(shù)組
  • 迭代器
    • ipairs()
    • pairs()
  • 回到Table

在【Lua學(xué)習(xí)筆記】Lua入門中我們講到了Lua的一些入門知識(shí)點(diǎn),本文將補(bǔ)充Lua的一些進(jìn)階知識(shí)


官方唯一指定數(shù)據(jù)結(jié)構(gòu)–table

在上篇文章的最后,我們指出通過查詢_G的字符索引,發(fā)現(xiàn)table.insert實(shí)際上是一個(gè)名為table的table結(jié)構(gòu)里的索引指向的函數(shù)

實(shí)際上不僅它,所有的函數(shù),模塊,全局變量,元表

😅😅😅都 是 T A B L E😅😅😅

我不知道作者是出于什么樣的心理活動(dòng)寫出的Lua,但確實(shí)讓我這個(gè)初學(xué)者大為震撼。

(以下內(nèi)容摘抄自Lua語言:基礎(chǔ)知識(shí))
但是作為Lua中唯一的數(shù)據(jù)結(jié)構(gòu),table還是很萬能的:

  • 它可以用任何類型作索引,不止number和string,也可以使用其他類型(甚至function和table)
  • Table功能強(qiáng)大,它即可以用作字典,也可以用作數(shù)組,配合元表機(jī)制還可以模擬面向?qū)ο蟆?/li>
  • Lua的很多基礎(chǔ)設(shè)施,比如模塊,全局變量,元表,都是基于table實(shí)現(xiàn)的。

table的一萬種用法

字典和數(shù)組

-- 當(dāng)成字典使用
local t = {a = 1,b = true,c = "abc",
}
-- 當(dāng)成數(shù)組使用
local t2 = {1, "aa", false}
這兩種都是很自然的用法,既能作為字典,又能作為數(shù)組
但是它也可以同時(shí)表示字典和數(shù)組
local t3 = {1, 2, 3,a = "aaa",b = "bbb",
}
print(t3[1])
print(t3.a)
結(jié)果:
1
aaa
需要注意的是其中的數(shù)組和字典是以兩種不同的方式存儲(chǔ)的local t3 = {a = "aaa",1, 2,b = "bbb",3
}
print(t3.a)
print(t3[1])
print(t3[3])
結(jié)果:
aaa
1
3
從上述例子我們能看到,數(shù)字索引直接訪問了數(shù)組元素略過了鍵值對,
使用鍵值對的key名才能訪問字典中對應(yīng)的值
使用下列模式使得它們在格式上更通用
local t3 = {[1] = 1, [2] = 2, [3] = 3,["a"] = "aaa",["b"] = "bbb",
}

但是上述只是個(gè)例子,在實(shí)踐中,我們最好不混用字典和數(shù)組,這常常會(huì)引發(fā)混亂的問題。而從設(shè)計(jì)的角度看,它違反了單一職責(zé)原則,比如空Table就存在著二義性,如果它是空的,那么請問這種情況下它是數(shù)組還是字典?這往往會(huì)導(dǎo)致使用時(shí)的各種問題,例子請看下文迭代器。


迭代器

雖然迭代器并不屬于Table的知識(shí),但我認(rèn)為在此處插入講一下是比較合適的。主要就是pairs和ipairs的區(qū)別

ipairs()

返回三個(gè)值(迭代函數(shù)、表 t 以及 0 ), 如此,以下代碼

    for i,v in ipairs(t) do body end

將迭代鍵值對 (1,t[1]) ,(2,t[2]), ... ,直到第一個(gè)空值。
例子:

local tab = {23,35,[3] = 45,78,[8] = 101,nil,80
}for k,v in ipairs(tab) doprint(k..":"..v)
end
輸出:
1:23
2:35
3:78
在上述例子中,ipairs遍歷了數(shù)組,但在nil時(shí)停下,實(shí)際上這個(gè)table的結(jié)構(gòu)應(yīng)該是這樣:
local tab: {[1]: integer = 23,[2]: integer = 35,[3]: integer = 45|78,[4]: nil,[5]: integer = 80,[8]: integer = 101,
}

來個(gè)更混亂的例子

local tab = {23,35,[3] = 45,78,["a"] = 5,[8] = 101,[3] = nil,1212,nil,80,["b"]=nil
}for k, v in ipairs(tab) doprint(k .. ":" .. v)
end
輸出:
1:23
2:35
3:78
4:1212這是它的實(shí)際結(jié)構(gòu)
local tab: {["a"]: integer = 5,["b"]: nil,[1]: integer = 23,[2]: integer = 35,[3]: integer|nil = 45|78,[4]: integer = 1212,[5]: nil,[6]: integer = 80,[8]: integer = 101,
}

可以看出ipair只會(huì)遍歷數(shù)字key名的元素(也就是數(shù)組類型),并且當(dāng)碰到nil時(shí)停下,而其他字典類型會(huì)被無視

而ipair會(huì)有三個(gè)返回值,分別是迭代函數(shù),表,index。讓我們看看這三個(gè)值在迭代器中是如何迭代的:

print("---index=0---")
funcA ,table, index =ipairs(tab)
for k, v in funcA, table, index doprint(k .. ":" .. v)
end
print("---index=1---")
for k, v in funcA, table, index+1 doprint(k .. ":" .. v)
end輸出:
---index=0---
1:23
2:35
3:78
4:1212
---index=1---
2:35
3:78
4:1212

從上述例子中可以看到,index實(shí)際上代表了起始序列,當(dāng)index=0,對應(yīng)從table的數(shù)組標(biāo)簽[1]開始,當(dāng)index=1,則從[2]開始

如果數(shù)組里有負(fù)數(shù)和0呢?

local tab = {[0] = 1,2,[-1] = 3,4,5,[5] = 6,
}
for k, v in ipairs(tab) doprint(k .. ":" .. v)
end
輸出:
1:2
2:4
3:5
實(shí)際的table結(jié)構(gòu)
local tab: {[0]: integer = 1,[1]: integer = 2,[-1]: integer = 3,[2]: integer = 4,[3]: integer = 5,[5]: integer = 6,
}

可以看到,0和負(fù)數(shù)都被ipairs自動(dòng)略過了,有意思的是由于[4]沒有定義,因此被認(rèn)為是nil而停止了迭代。

總結(jié):ipairs會(huì)略過數(shù)組的0和負(fù)數(shù)索引,以及其他字典索引,從數(shù)組的[1]索引開始迭代(對應(yīng)index=0),順序迭代直到某個(gè)索引不存在或其對應(yīng)的值為空時(shí)結(jié)束


pairs()

讓我們把上述幾個(gè)例子用pairs遍歷一下

local tab = {23,35,[3] = 45,78,[8] = 101,nil,80
}for k,v in pairs(tab) doprint(k..":"..v)
end
輸出:
1:23
2:35
3:78
5:80
8:101
table的結(jié)構(gòu)是這樣:
local tab: {[1]: integer = 23,[2]: integer = 35,[3]: integer = 45|78,[4]: nil,[5]: integer = 80,[8]: integer = 101,
}

可以看到重復(fù)定義的元素值還是選擇了后者,并且nil被無視了

local tab = {["b"]=8,[0] = 1,2,[-1] = 3,4,5,[5] = 6,["a"]=7,
}
for k, v in pairs(tab) doprint(k .. ":" .. v)
end
輸出:
1:2
2:4
3:5
0:1
b:8
a:7
-1:3
5:6
實(shí)際的table結(jié)構(gòu)
local tab: {[0]: integer = 1,[1]: integer = 2,[-1]: integer = 3,[2]: integer = 4,[3]: integer = 5,[5]: integer = 6,["a"]: integer = 7,["b"]: integer = 8,
}

有意思的是pairs是先按數(shù)字順序輸出了數(shù)組,然后碰到了不存在的索引[4],隨后輸出了0,b,a,-1。順序十分詭異,最后才輸出了[5]。我不知道為什么這樣輸出,但是這種輸出方式也側(cè)面證明了數(shù)組不要和字典一起定義!

總結(jié):
ipairs會(huì)略過數(shù)組非正數(shù)索引,以及其他字典索引,從數(shù)組的[1]索引開始迭代(對應(yīng)index=0),順序迭代直到某個(gè)索引不存在或其對應(yīng)的值為空時(shí)結(jié)束。

pairs可以輸出table內(nèi)除了nil以外的所有元素。但是數(shù)組和字典的混合以及帶有非正值數(shù)字索引的元素輸出方式會(huì)很詭異。

所以別用非正數(shù)索引(實(shí)際上非正索引應(yīng)當(dāng)稱為自定義索引),也別把數(shù)組和字典定義在一個(gè)table里!


回到Table

table將key的值設(shè)為nil,它的真實(shí)含義是刪除掉這個(gè)key,這和其他腳本很不一樣,也可能引發(fā)一些問題,比如看下面例子:

local t = {1, 2, nil, 4}
print(#t)  ---> 4
for k, v in ipairs(t) do print(v) end   ---> 1 2
for k, v in pairs(t) do print(v) end   ---> 1 2 4
for i = 1, #t do print(t[i]) end  ---> 1 2 nil 4

可以看到使用迭代器是直接無視nil的,但使用for遍歷會(huì)得到nil,我們本意是想刪除這個(gè)元素,但是它依然存在于table中
那么nil不等于刪除嗎?請看下列的例子:

local t = {1, 2, nil, nil, 5}
print(#t) --> 5
t = {[1]=1, [2]=2, [3]=nil, [4]=nil, [5]=4}
print(#t) --> 2

直接定義nil時(shí),nil是會(huì)計(jì)入table的長度的。但主動(dòng)定義鍵值對時(shí)nil不會(huì)計(jì)入table的長度。因此當(dāng)我們定義table時(shí),應(yīng)當(dāng)以鍵值對的方式定義

過分嗎?還有更過分的

a = { [1] = 1, [2] = 2, [5] = 5, [6] = 6 }
print(#a) -->2
b = { [1] = 1, [2] = 2, [4] = 4, [5] = 5, [6] = 6 }
print(#b) -->6
c = { [1] = 1, [2] = 2, [4] = 4, [5] = 5, [6] = 6, [9] = 9 }
print(#c) -->6
d = { [1] = 1, [2] = 2, [4] = 4, [5] = 5, [6] = 6, [8] = 8, [9] = 9 }
print(#d) -->6

發(fā)現(xiàn)了嗎?鍵值對形式存儲(chǔ)時(shí),中間如果隔了一個(gè)nil,那么長度會(huì)接上;如果隔了兩個(gè)nil長度就會(huì)斷開

???
🧠
(O.o)>


http://aloenet.com.cn/news/30884.html

相關(guān)文章:

  • 路橋網(wǎng)站制作制作網(wǎng)頁教程
  • 鎮(zhèn)江網(wǎng)站關(guān)鍵字優(yōu)化公司百度地圖在線查詢
  • 網(wǎng)站工程師培訓(xùn)學(xué)校網(wǎng)站是怎么做的
  • 網(wǎng)站建設(shè)學(xué)多久中鐵建設(shè)集團(tuán)有限公司
  • 合肥網(wǎng)站建站推廣瀏覽廣告賺錢的平臺(tái)
  • 珠海網(wǎng)站設(shè)計(jì)全球十大搜索引擎排名及網(wǎng)址
  • 商城網(wǎng)站源代碼關(guān)鍵詞包括哪些內(nèi)容
  • 建網(wǎng)站公司聯(lián)系方式關(guān)鍵洞察力
  • ps網(wǎng)站制作教程汕頭seo代理商
  • 漯河市萬金鎮(zhèn)網(wǎng)站建設(shè)高端品牌網(wǎng)站建設(shè)
  • 書店網(wǎng)站建設(shè)游戲優(yōu)化大師官方下載
  • 怎么建立網(wǎng)站網(wǎng)址百度網(wǎng)站認(rèn)證
  • 西安網(wǎng)站建設(shè)有那些公司好建立網(wǎng)站的基本流程
  • 做網(wǎng)站前景搜索引擎排名機(jī)制
  • 貴州網(wǎng)站建設(shè)關(guān)鍵詞代發(fā)排名首頁
  • 濟(jì)南集團(tuán)網(wǎng)站建設(shè)方案做公司網(wǎng)站的公司
  • 做照片相冊最好的網(wǎng)站自己如何注冊一個(gè)網(wǎng)站
  • 武漢做商城網(wǎng)站seo排名關(guān)鍵詞點(diǎn)擊
  • 湖北省稅務(wù)局網(wǎng)站建設(shè)方sem和seo哪個(gè)工作好
  • 網(wǎng)站建設(shè)怎樣回答客戶問題優(yōu)化怎么做
  • ofbiz做的網(wǎng)站營銷方案策劃
  • 如何用wordpress做視頻網(wǎng)站品牌seo培訓(xùn)咨詢
  • 怎么做汽車網(wǎng)站seo入門免費(fèi)教程
  • 婦科醫(yī)院網(wǎng)站建設(shè)怎么做汽車營銷活動(dòng)策劃方案
  • wordpress代碼實(shí)現(xiàn)怎么做seo關(guān)鍵詞優(yōu)化
  • 嘉興做微網(wǎng)站多少錢seo推廣優(yōu)化多少錢
  • 黑龍江疫情太嚴(yán)重了廣州網(wǎng)站優(yōu)化
  • 做網(wǎng)站是需要多少錢武漢大學(xué)人民醫(yī)院洪山院區(qū)
  • 交友網(wǎng)站美女要一起做外貿(mào)跨境網(wǎng)站建站
  • 怎么做犬舍網(wǎng)站網(wǎng)絡(luò)營銷有哪些推廣方式