lua學習之table型別
阿新 • • 發佈:2019-01-03
關係表型別,這是一個很強大的型別。我們可以把這個型別看作是一個數組。只是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
--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 )
注意三點: 第一,所有元素之間,總是用逗號 "," 隔開; 第二,所有索引值都需要用 "["和"]" 括起來;如果是字串,還可以去掉引號和中括號; 即如果沒有[]括起,則認為是字串索引 第三,如果不寫索引,則索引就會被認為是數字,並按順序自動從 1往後編; 例如: tt = {
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 elementvalue
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
.
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 )