關於lua中的table,主要的困惑來自於table既可以當array用又可以當record用,有時候就會混淆不清。
lua中的table貌似是用map來實現的,array是語法糖,一種特例。下面是lua中構造table的標准方法:
local numbers = {[1]=1, [2]=2, ["x"]=3, [type]=4} numbers[1] == 1 numbers[2] == 2 numbers.x == 3 numbers[type] == 4
構造table的標准方法是建立[key]=value的鍵值對,訪問的時候通過table[key]的形式來獲取到value。
numbers.x 等價於 numbers[“x”]
把table當array用:不用寫key了,訪問的時候用table[index]的形式來獲取到value。注意array不連續時遍歷可能出現問題。
local numbers = {1, 2, 3} numbers[5] = 5 for i=1,#numbers do print(numbers[i]) -- 1,2,3 end
沒有遍歷到numbers[5],這是因為#numbers的值只是3,#這個操作符很奇怪,當array不連續的時候它並不能獲取到正確的長度,獲取到的是從1開始的連續數組的長度。所以一旦array發生了刪改,就不能依賴#來獲取到長度了。不過從另外一個方面講,既然數組已經是不連續的了,那么獲取table的長度也就沒什么意義了。
如果在數組不連續的狀況下仍然要對數組進行順序遍歷操作,可以使用table.maxn函數,這將得到最大的整數key。
這跟array本身的性質是一致的,想想在C++里面,如果要刪除array里的一個元素,還不是得進行整塊的數據移動。我想如果要把table當array用的話,就要盡量避免不要出現不連續的情況。
把table當record用:numbers.x 等價於 numbers[“x”],實際上numbers.x 這種就是字符串作為key的一種語法糖。
另外table可以record和array混合着用:
local numbers = {1, 2, 3, x="hello", 4, y="ha?"} for key,value in pairs(numbers) do print("key: " .. tostring(key) .. ", value: " .. tostring(value)) end -- key: 1, value: 1 -- key: 2, value: 2 -- key: 3, value: 3 -- key: 4, value: 4 -- key: y, value: ha? -- key: x, value: hello
這個其實也倒沒什么,就是看起來畸形了點,實際中還是少用為妙。
關於table的遍歷簡單說一下看法:
如果把table當array用的並且是連續的話,使用for i=1,#numbers do的方法簡潔不少。如果array不連續但是硬要遍歷,那就用for i=1, table.maxn(numbers) do
如果把table當record用的話,那就用for key,value in pairs(numbers) do。這種方法也可以遍歷array,但是貌似不是順序遍歷。
至於還有一種方法for key,value in ipairs(numbers) do,貌似效果跟#numbers是類似的,所以就沒必要用它了,不方便。
PS:再多說一下對於table進行操作的幾個函數:
table.getn() :效果和#一樣
table.foreach(key, value):效果和for key,value in pairs(numbers) do 一樣
table.foreachi(key, value): 效果和for key,value in ipairs(numbers) do 一樣
table.insert(table, pos, value): 在array中指定位置插入一個元素,類似於STL中vector的insert,把插入元素時數組的移動封裝起來了,挺好用的
table.remove : 不說了,和insert對應
table.concat(table, sep, start, end) : 返回一個字符串,其中包含了以sep作為分隔符的從start到end的元素
具體的情況可以參考一篇文章:http://rangercyh.blog.51cto.com/1444712/1032925