1. 程式人生 > >lua學習之table型別

lua學習之table型別

關係表型別,這是一個很強大的型別。我們可以把這個型別看作是一個數組。只是C語言的陣列,只能用正整數來作索引; Lua中,你可以用任意型別的來作陣列的索引,但這個值不能是nil同樣,在C語言中,陣列的內容只允許一種型別;在Lua中,你也可以用任意型別的值來作陣列的內容,nil也可以 基本介紹
注意三點:     第一,所有元素之間,總是用逗號 "" 隔開;    第二,所有索引值都需要用 "[""]" 括起來;如果是字串,還可以去掉引號和中括號; 即如果沒有[]括起,則認為是字串索引    第三,如果不寫索引,則索引就會被認為是數字,並按順序自動從 1往後編; 例如: tt = {
"hello" ,33} value = 4 tab = {[tt] = "table",key = value, ["flag" ] = nil, 11} print(tab[tt]) print(tab.key) print(tab[1 ]) 以上寫法都是對的。 look = {[www] = "ok"}這樣是不對的,www沒有賦值,所以預設為nil因此出錯table index is nil --- temp = 1 tab = {[temp] = 1, 11} print(tab[temp]) --此時的結果是11,因為11沒有顯式對應的key,因此從1開始,如果前面定義了,則覆蓋其value --- temp = 2 tab = {[temp] = 1, 11}
temp = 1 print(tab[temp]) -- 結果是11,雖然定義時[temp] = 1,但是後來我們改變了temp的值,所以指向另外的key了  以上可知: 1.對於字串,在{}定義時,可以key = value, 也可以["flag"] = nil,索引都是string型別,對於非nil型別變數(包括字串),都可以[variable]=value的方式 2.使用table時,對於字串,可以通過.的方式訪問,也可以通過[]方式訪問。tab[a],tab[b],只要a==b那麼tab[a]可以訪問到tab[b]的值 3.不管定義索引時用的是常量還是變數,最終table中value的索引key是常量
,不會隨變數的改變而變化該value的key
巢狀 tb11= {tb12 = {bool = true}} -- simple, it's a table IN a table :) -- Call magic! print(tb11.tb12.bool ) -- works fine, since it's calling the key and value correctly. print(tab11["tb12" ].bool ) --same as line 33 print(tab11.tb12 ["bool"]) --same as line 33 print(tab11["tb12" ]["bool"]) --same as line 33 修改table的value --Altering a table's content. Basically manipulating the values of the keys. lucky= {john="chips" ,jane ="lemonade",jolene="egg salad" } lucky.jolene = "fruit salad" --changed the value to "fruit salad" instead of "egg salad" lucky.jerry = "fagaso food" -- adding a new key-value pair to the container lucky. lucky.john = nil -- remove john from giving anything or from being a key. table的易變性 a = {}; b = a; print(a == b) --> true c,d = {},{}; print(c == d) -->false table庫函式使用 ----------------------------------------------------------- Sorts table elements in a given order, in-place, from table[1] to table[n], where n is the length of the table. If comp is given, then it must be a function that receives two table elements, and returns true when the first is less than the second (so that not comp(a[i+1],a[i]) will be true after the sort). If comp is not given, then the standard Lua operator < is used instead.

The sort algorithm is not stable; that is, elements considered equal by the given order may have their relative positions changed by the sort.

name = {"you" ,"me", "him","bill" } --table.sort - only works with arrays! table.sort(name) for k, v in ipairs( name) do  print( k,v) end --table.sort uses callbacks. a function that is writtent to be called by a library function. function cmp( a, b)  if string.sub(a,2 ,2) < string.sub(b,2 ,2) then  return true  else  return false  end end table.sort(name, cmp) for k, v in ipairs( name) do  print( k,v) end Inserts element value at position pos in table, shifting up other elements to open space, if necessary. The default value for pos is n+1, where n is the length of the table so that a call table.insert(t,x) inserts x at the end of table t. --table.insert --an easy to copy a table to another table or adding elements to an array.! foo = {"a" ,"c", "d"} bar = {} function printt( table) for i=1 ,#table do  print(i,table [i ]) end end print("before insert:" ) printt(foo) table.insert(foo,2 ,"b") print("after insert" ) printt(foo) Given an array where all elements are strings or numbers, returns table[i]..sep..table[i+1] ··· sep..table[j]. The default value for sep is the empty string, the default for i is 1, and the default for j is the length of the table. If i is greater than j, returns the empty string.  --table.concat does what it implies. Takes an array and concates to one string. num = {1 ,2, 3,4,5 ,6} print(table.concat (num ,"<"))

Removes from table the element at position pos, shifting down other elements to close the space, if necessary. Returns the value of the removed element. The default value for pos is n, where n is the length of the table, so that a call table.remove(t) removes the last element of table t.

abc = {"a" ,"b", "c"} print(table.remove (abc ,2)) print("abc length = " .. #abc)

Returns the largest positive numerical index of the given table, or zero if the table has no positive numerical indices. (To do its job this function does a linear traversal of the whole table.)

--table.maxn apple = {"a" ,"p",[ 5]="e"} print(table.maxn (apple )) -- 5 duck = {[-2 ]=3,[- 1]=0} print(table.maxn (duck )) -- 0 面向物件程式設計 --note for a object to work, it needs a closure(inner function with an upvalue(a local value from a higher scope))
--note: the more closures made, the slower the program would run.
function mg1( n) local function get ()  return n ; end local function inc (m )         n = n +m ; end return {get = get, inc= inc} end object = mg1(50 ) print(object.get ()) print(object["get" ]()) object.inc(2 ) print(object.get ()) ---------------------------------------- do local function get (o )