2.8 table类型
table类型是非常重要的Lua数据类型,也是Lua唯一的能够描述数据结构的类型, table类型很灵活可以用于描述多种数据结构,table类型本身是一种基于“键值对”字典结构。它可以描述数组、链表、队列和字典(或Map)等。此外,在面向对象的技术中table还可以描述对象。
下面分别介绍table类型描述的两种典型数据结构——字典和数组,进而了解table类型的创建、初始化、访问和遍历等过程。
2.8.1 字典
table类型是使用{}创建和初始化,{}表示方式被称为table构造器(constructor),最简单的表示方式是空{},但是在描述字典和数组时构造器的表示方式是不同的。字典结构的table构造器示例如下:
Student1 ={id="100", name="Tony", age=18} ① Student2 ={["id"]="100", ["name"]="Tony", ["age"]=18} ② print("Student1 ID:"..Student1["id"]) ③ print("Student1 Name:"..Student1["name"]) print("Student1 Age:"..Student1["age"]) print("Student2 ID:"..Student2.id) ④ print("Student2 Name:"..Student2.name) print("Student2 Age:"..Student2.age)
上述代码第①行和第②行分别创建了Student1和Student2两个table变量。第②行的键表示方式比较复杂,键是在["和"]之间包裹起来。而第①行的键表示方法非常简洁。
在访问这些table变量时候,可以使用两种方法,第③行代码Student1["id"]是访问Student1的id键对应的内容,这里的键可以放置在双引号(")之间。而另一种访问方式即第④行代码Student2.id,这种方式是通过点访问符(.)直接访问id。
采用哪种创建以及采用哪种方式访问完全由自己决定。
下面我们看看遍历字典结构table。遍历字典结构table可以使用迭代for-in语句,示例代码如下:
Student1 ={id="100", name="Tony", age=18} for k, v in pairs(Student1) do ① print(k ..":"..v) end
运行结果如下:
id :100 name : Tony age : 18
上述代码第①行使用pairs函数,该函数可以从字典结构table变量中返回键(k)和值(v)。
2.8.2 数组
数组结构是一种特殊的table结构,创建和初始化数组结构table类型也是使用构造器{}实现的。
数组结构的table构造器示例如下:
local studentList ={"张三", "李四", "王五", "董六"} ① print("------遍历 1-------") for i, v in ipairs(studentList) do ② print(i ..":"..v) end print("------遍历2-------") for k, v in pairs(studentList) do ③ print(k ..":"..v) end print("------遍历3-------") for i = 1, #studentList do ④ print(i ..":"..studentList[i]) end
运行结果如下:
----遍历 1---- 1 :张三 2 :李四 3 :王五 4 :董六 ----遍历 2---- 1 :张三 2 :李四 3 :王五 4 :董六 ----遍历3---- 1 :张三 2 :李四 3 :王五 4 :董六
上述代码第①行是创建并初始化数组结构table变量studentList,这种结构不再需要键了。接着通过第②~④行代码进行遍历studentList数组,其中代码第②行使用了ipairs函数,ipairs函数返回数组索引(i)和值(v)。
注意 ipairs函数不能使用于字典结构table遍历。
上述代码第③行使用pairs函数,该函数可以从studentList变量中返回键(k)和值(v)。对于数组结构的键就是索引。
第④行代码使用典型的for循环,其中#studentList是获得数组的长度,对于旧版本的Lua可以使用table.getn(studentList)函数获得长度。
注意 典型的for循环不能使用字典结构table遍历。