Lua - 表

  • 介绍

    表是 Lua 中唯一可用的数据结构,可以帮助我们创建不同的类型,如数组和字典。Lua 使用关联数组,它不仅可以用数字索引,还可以用除 nil 之外的字符串索引。表没有固定的大小,可以根据我们的需要增长。
    Lua 在所有表示中都使用表,包括包的表示。当我们访问一个方法 string.format 时,这意味着我们正在访问 string 包中可用的 format 函数。
  • 表示和使用

    表称为对象,它们既不是值也不是变量。Lua 使用构造函数表达式 {} 创建一个空表。要知道,保存表引用的变量与表本身之间没有固定的关系。
    
    --sample table initialization
    mytable = {}
    --simple table value assignment
    mytable[1]= "Lua"
    --removing reference
    mytable = nil
    -- lua garbage collection will take care of releasing memory
    
    当我们有一张表 a 带有一组元素,如果我们将其分配给 b, 两个都 ab引用同一个内存。没有为 b 单独分配单独的内存。当 a 设置为 nil 时,b 仍然可以访问 table。当没有对表的引用时,Lua 中的垃圾回收会负责清理进程,以使这些未引用的内存再次被重用。
    下面显示了一个示例,用于解释上述表格的特征。
    
    -- Simple empty table
    mytable = {}
    print("Type of mytable is ",type(mytable))
    mytable[1]= "Lua"
    mytable["wow"] = "Tutorial"
    print("mytable Element at index 1 is ", mytable[1])
    print("mytable Element at index wow is ", mytable["wow"])
    -- alternatetable and mytable refers to same table
    alternatetable = mytable
    print("alternatetable Element at index 1 is ", alternatetable[1])
    print("alternatetable Element at index wow is ", alternatetable["wow"])
    alternatetable["wow"] = "I changed it"
    print("mytable Element at index wow is ", mytable["wow"])
    -- only variable released and and not table
    alternatetable = nil
    print("alternatetable is ", alternatetable)
    -- mytable is still accessible
    print("mytable Element at index wow is ", mytable["wow"])
    mytable = nil
    print("mytable is ", mytable)
    
    当我们运行上面的程序时,我们将得到以下输出 -
    
    Type of mytable is  table
    mytable Element at index 1 is   Lua
    mytable Element at index wow is     Tutorial
    alternatetable Element at index 1 is    Lua
    alternatetable Element at index wow is  Tutorial
    mytable Element at index wow is     I changed it
    alternatetable is   nil
    mytable Element at index wow is     I changed it
    mytable is  nil
    
  • 表格操作

    有用于表操作的内置函数,它们列在下表中。
    序号 方法和目的
    1
    table.concat (table [, sep [, i [, j]]])
    根据给定的参数连接表中的字符串。有关详细信息,请参见示例。
    2
    table.insert (table, [pos,] value)
    在表中指定位置插入一个值。
    3
    table.maxn (table)
    返回最大的数字索引。
    4
    table.remove (table [, pos])
    从表中删除值。
    5
    table.sort (table [, comp])
    根据可选的比较器参数对表进行排序。
    让我们看看上述函数的一些示例。
  • 表串联

    我们可以使用 concat 函数连接两个表,如下所示 -
    
    fruits = {"banana","orange","apple"}
    -- returns concatenated string of table
    print("Concatenated string ",table.concat(fruits))
    --concatenate with a character
    print("Concatenated string ",table.concat(fruits,", "))
    --concatenate fruits based on index
    print("Concatenated string ",table.concat(fruits,", ", 2,3))
    
    当我们运行上面的程序时,我们将得到以下输出 -
    
    Concatenated string     bananaorangeapple
    Concatenated string     banana, orange, apple
    Concatenated string     orange, apple
    
  • 插入和删除

    表中项目的插入和删除在表操作中最常见。下面进行说明。
    
    fruits = {"banana","orange","apple"}
    -- insert a fruit at the end
    table.insert(fruits,"mango")
    print("Fruit at index 4 is ",fruits[4])
    --insert fruit at index 2
    table.insert(fruits,2,"grapes")
    print("Fruit at index 2 is ",fruits[2])
    print("The maximum elements in table is",table.maxn(fruits))
    print("The last element is",fruits[5])
    table.remove(fruits)
    print("The previous last element is",fruits[5])
    
    当我们运行上面的程序时,我们将得到以下输出 -
    
    Fruit at index 4 is     mango
    Fruit at index 2 is     grapes
    The maximum elements in table is    5
    The last element is mango
    The previous last element is    nil
    
  • 排序表

    我们经常需要按特定顺序对表格进行排序。排序函数按字母顺序对表中的元素进行排序。下面显示了一个示例。
    
    fruits = {"banana","orange","apple","grapes"}
    for k,v in ipairs(fruits) do
       print(k,v)
    end
    table.sort(fruits)
    print("sorted table")
    for k,v in ipairs(fruits) do
       print(k,v)
    end
    
    当我们运行上面的程序时,我们将得到以下输出 -
    
    1   banana
    2   orange
    3   apple
    4   grapes
    sorted table
    1   apple
    2   banana
    3   grapes
    4   orange