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遍历。