1 Table
1.1 Table简单理解就是一种特殊索引的特殊数组。
特殊索引指:不仅使用某种特定索引,可以使用包括:字符串、其它任意类型值(包括Boolean,number,function,table,除了nil),简单而言就是常量值,table的索引必须是已知值,所以使用变量作为索引值也能理解为以上所列出的索引值。
t={}
var="index"
t[var]=1000 -- 等同于 t["index"]
特殊数组:Table的值可以为任意类型值,可以将Table表示为:普通数组、符号表、集合、记录、队列等数据结构,同时Lua中的模块(module)、包(package)和对象(object)也是使用Tabable实现的
可以将Table理解为一种索引数组:
t["index"] = "value"
1.2 访问Table的值:使用索引对值进行新增,修改,读取
为了更方便的访问Table,可以将Table作为一条条记录访问,索引t["name"]提供了一种更简便的写法t.name,这是一种语法糖,此时的理解是,可以将name作为table的一个字段,是一种固定的预定义的索引Key,其实本质只是对字符串索引的一种简写,注意:使用字段(.)方式访问只适用于字符串索引。
所以a.x和a[x]是完全不等价的,第二个中x必须是一个已定义变量,否则a[x]就是一个Nil,以下是一个例子说明字段(.)访问的本质
a={}
a.x = 10 -- 等价于a["x"]
print(a.x) -- 10
x="y"
a[x] = 20 -- 等价于a["y"]或a.y
print(a[x]) -- 20
print(a["y"]) -- 20
print(a.y) -- 20
其它类型值只能使用特定的索引方式: t["index"] = "value"1.3 Table的构造式
初始化数组的方式:索引是整数,从1 开始
t={}
t={"1", "2", 1, 2, true}
print(t[1]) -- "1"
print(t[3]) -- "1"
print(t[5]) -- "true"
最基本的索引方式:t = {["index"]="value"},索引可以为其它非Nil已知的值t={}
t={[0]="1", ["2"]="2", ["x"]=3}
print(t[0]) -- "1"
print(t["2"]) -- "2"
print(t["x"]) -- "3"
print(t.x) -- "3"
使用记录(.)风格的初始化方式t={x=1,y=2} -- 等价 t={}; t.x=1; t.y=2,
--其实就是:
t={["x"]=1,["y"]=2}
print(t.x) -- "1"
print(t["x"]) -- "1"
更经常使用的是混合的初始化方法,可以使用(;)分隔不同风格的初始化,重复索引会被覆盖,数组风格初始化值会从1开始,不会被覆盖
t={[0]=0; x=1,y=2; [1]={1,2,3}; 1000, [1]=0}
for k,v in pairs(t) do print(k,v) end
--1 1000
--0 0
--x 1
--y 2