2.Table*

Lua中的复杂数据结构基本都是通过复杂数据结构实现

一、字典

  1. 字典不能使用ipair遍历
  2. 字典使用表由键值对组成
--字典是由键值对构成 
a = {["name"] = "TestName", ["age"] = 14, ["1"] = 5}
--访问当个变量 用中括号填键 来访问
print(a["name"])
print(a["age"])
print(a["1"])
  1. 声明后可直接新增、修改、删除
--修改
a["name"] = "TLS";
--新增
a["sex"] = false
--删除
a["sex"] = nil

image

print("**********复杂数据类型——表2************")
print("**********字典************")
print("**********字典的申明************")
--字典是由键值对构成 
a = {["name"] = "TestName", ["age"] = 14, ["1"] = 5}
--访问当个变量 用中括号填键 来访问
print(a["name"])
print(a["age"])
print(a["1"])
--还可以类似.成员变量的形式得到值
print(a.name)
print(a.age)
--虽然可以通过.成员变量的形式得到值 但是不能是数字
print(a["1"])
--修改
a["name"] = "TLS";
print(a["name"])
print(a.name)
--新增
a["sex"] = false
print(a["sex"])
print(a.sex)
--删除
a["sex"] = nil
print(a["sex"])
print(a.sex)
print("**********字典的遍历************")
--如果要模拟字典 遍历一定用pairs
for k,v in pairs(a) do
    --可以传多个参数 一样可以打印出来
    print(k,v)
end

for k in pairs(a) do
    print(k)
    print(a[k])
end
-- 该方式仍然是遍历键值
for _,v in pairs(a) do
    print(_, v)
end

输出:

**********复杂数据类型——表2************
**********字典************
**********字典的申明************
TestName
14
5
TestName
14
5
TLS
TLS
false
false
nil
nil
**********字典的遍历************
1    5
age    14
name    TLS
1
5
age
14
name
TLS
1    5
age    14
name    TLS

二、类和结构体

lua默认是没有面向对象的,但我们可以使用表来间接实现面向对象

  1. ​​.​​的区别 会把调用者作为第一个参数,即self,但self并不是this
  2. 使用表自身的参数
  • Table.Variable
  • Function(t) 采用Table:Function()
  1. 声明表后,增加、删除、修改的方式等同于字典

image

print("**********类和结构体************")

--Lua中是默认没有面向对象的 需要我们自己来实现
--成员变量 成员函数。。。。
Student = { 
    --年龄
    age = 1, 
    --性别
    sex = true,
    --成长函数
    Up = function()
        --这样写 这个age 和表中的age没有任何关系 它是一个全局变量
        --print(age)

        --想要在表内部函数中 调用表本身的属性或者方法
        --一定要指定是谁的 所以要使用 表名.属性 或 表名.方法
        print(Student.age)
        print("长大了")
    end,
    --学习函数
    Learn = function(t)
        --第二种 能够在函数内部调用自己属性或者方法的 方法
        --把自己作为一个参数传进来 在内部 访问
        print(t.sex)
        print("好好学习,天天向上")
    end
}

--Lua中 .和冒号的区别
Student.Learn(Student)
--冒号调用方法 会默认把调用者 作为第一个参数传入方法中
Student:Learn()

--申明表过后 在表外去申明表有的变量和方法
Student.name = "改变名字"
Student.Speak = function()
    print("说话")
end
--函数的第三种申明方式
function Student:Speak2()
    --lua中 有一个关键字 self 表示 默认传入的第一个参数
    print(self.name .. "说话")
end

--C#要是使用类 实例化对象new 静态直接点
--Lua中类的表现 更像是一个类中有很多 静态变量和函数
print(Student.age)
print(Student.name)
Student.Up()
Student.Speak()
Student:Speak2()
Student.Speak2(Student)

输出:

**********类和结构体************
true
好好学习,天天向上
true
好好学习,天天向上
1
改变名字
1
长大了
说话
改变名字说话
改变名字说话

三、表的公共操作

主要是插入、删除、排序、拼接

  1. 插入
t1 = { {age = 1, name = "123"}, {age = 2, name = "345"} }
t2 = {name = "小海豚", sex = true}
--将t2插入到t1的尾部
table.insert(t1, t2)
  1. 删除
-- 移除尾部元素
table.remove(t1)
-- 移除索引处元素(从1开始)
table.remove(t1,2)
  1. 排序
--传入要排序的表 默认 升序排列
table.sort(t2)
-- 降序
table.sort(t2, function(a,b)
    if a > b then
        return true
    end
end)
  1. 拼接
tb = {"123", "456", "789", "10101"}
--连接函数 用于拼接表中元素 返回值 是一个字符串
str = table.concat(tb, ",")
-- 输出 123,456,789,10101 的字符串

image

print("**********表的公共操作************")
--表中 table提供的一些公共方法的讲解

t1 = { {age = 1, name = "123"}, {age = 2, name = "345"} }

t2 = {name = "小海豚", sex = true}
print("**********插入************")
--插入
print(#t1)
table.insert(t1, t2);
print(#t1)
print(t1[1])
print(t1[2])
print(t1[3])
print(t1[3].sex)
print("**********移除************")
--删除指定元素
--remove方法 传表进去 会移除最后一个索引的内容
table.remove(t1)
print(#t1)
print(t1[1].name)
print(t1[2].name)
print(t1[3])

--remove方法 传两个参数 第一个参数 是要移除内容的表
--第二个参数 是要移除内容的索引
table.remove(t1, 1)
print(t1[1].name)
print(#t1)
print("**********排序************")
t2 = {5,2,7,9,5}
--传入要排序的表 默认 升序排列
table.sort(t2)
for _,v in pairs(t2) do
    print(v)
end
print("**********降序************")
--传入两个参数 第一个是用于排序的表
--第二个是 排序规则函数
table.sort(t2, function(a,b)
    if a > b then
        return true
    end
end)
for _,v in pairs(t2) do
    print(v)
end

print("**********拼接************")
tb = {"123", "456", "789", "10101"}
--连接函数 用于拼接表中元素 返回值 是一个字符串
str = table.concat(tb, ",")
print(str)

输出

**********表的公共操作************
**********插入************
2
3
table: 00BCA8D0
table: 00BCA920
table: 00BCA880
true
**********移除************
2
123
345
nil
345
1
**********排序************
2
5
5
7
9
**********降序************
9
7
5
5
2
**********拼接************

本文介绍了Lua中Table(表)的三种主要用法:字典、类和结构体、公共操作。字典通过键值对实现,支持增删改查,使用pairs遍历;类和结构体通过表模拟面向对象,区分了"."和":"操作符的差异,演示了成员变量/函数的定义与调用;公共操作部分涵盖插入、删除、排序等常用功能。文中包含具体代码示例,展示了表的声明、修改、遍历及面向对象特性的实现方式。

最后修改:2025 年 06 月 04 日
如果觉得我的文章对你有用,请随意赞赏