【Lua学习笔记】Lua进阶——Table(2)

文章目录

接上文【Lua学习笔记】Lua进阶------Table,迭代器


Table的一万种用法

二维数组

lua 复制代码
a = {
    { 1, 2, 3 },
    { 4, 5, 6 },
}
print(#a) -->2
for i=1,#a do
    b = a[i]
    for j=1,#b do
        print(b[j])
    end
end
应该不用解释吧?

类和结构体

Lua是面向过程的,所以想要实现面向对象只能在形式上模拟。

那么面向对象要实现什么?继承封装多态,这些暂且不谈,首先一个类模块应当需要成员变量和成员方法。

lua 复制代码
car = {
    color = "red",
    size = "big",
    StartEngine = function()
        print("汽车,启动!")
    end,
}
car.StartEngine();
--在table外声明方法
car.StopEngine = function()
    print("停车")
end
car.StopEngine();
--另一种声明方式
function car.Speaker()
    print("嘟嘟嘟")
end
car.Speaker()
输出:
汽车,启动!
停车
嘟嘟嘟

上述代码确实看起来很像类,但是应当记住它是个table,别真的把它当作面向对象了,例如下面:

lua 复制代码
car = {
    color = "red",
    size = "big",
    StartEngine = function()
        print(color)
    end,
}
car.StartEngine();
输出
nil

car = {
    color = "red",
    size = "big",
    StartEngine = function()
        print(car.color)
    end,
}
car.StartEngine();
输出
red

很简单,如果直接print(color),那么color则是我们新定义的一个全局变量,它没有赋值自然是nil。

而想要打出red,就需要print(car.color),因为我们要打印的不是color,而是car这个table中的一个元素!

lua 复制代码
car = {
    color = "red",
    size = "big",
    StartEngine = function()
        print(self.color)
    end,
    PrintColor = function (t)
        print(t.color)
    end
}
car.PrintColor(car);
car:PrintColor();
输出:
red
red

lua提供了一个语法糖,当我们用冒号调用方法时,会把调用者作为第一个参数传入方法中

lua 复制代码
function car:PrintSize()  --相当于function car.PrintSize(car)
    print(self.size)
end
car.PrintSize(car);
car:PrintSize()
car:PrintSize(car)
输出:
big
big
big

冒号主要就是为了在函数调用时使用self关键字,self不同与this,它代表的应当是这个冒号传入的参数。除了提供便利性之外,冒号还会为我们节省一条指令。有种脱裤子放屁的美。


Table操作

insert & remove

lua 复制代码
t1 = {
    { age = 1, name = "a" },
    { age = 2, name = "b" },
}
t2 = { age = 3, name = "c" } --注意t2是一维的

for i = 1, #t1 do
    b = t1[i]
    print(b)
end
print("插入后")
table.insert(t1,t2)
for i = 1, #t1 do
    b = t1[i]
    print(b)
end
print(t1[1].name)
print(t1[2].name)
print(t1[3].name)

table: 00A2A580
table: 00A2A4B8
插入后
table: 00A2A580
table: 00A2A4B8
table: 00A2A5D0
a
b
c

执行insert后,我们观察地址不难发现,新数据被插入到尾部了,同样的,执行table.remove方法也会移除最后一个索引的元素。

cpp 复制代码
table.insert(t1,2,t2)
for i = 1, #t1 do
    b = t1[i]
    print(b)
end
print(t1[1].name)
print(t1[2].name)
print(t1[3].name)

a
c
b

table.remove(t1,2,t2)
for i = 1, #t1 do
    b = t1[i]
    print(b)
end
print(t1[1].name)
print(t1[2].name)
print(t1[3].name) --报错
a
b

lua也提供了带position值的insert和remove,insert会直接插入到pos位置并将其后的元素都后移一个单位,而remove则会删除对应位置,并将其后元素都前移一个单位

sort

table.sort排序用法

lua 复制代码
t = { 2, 5, 5, 3, 6 }
table.sort(t)
for index, value in ipairs(t) do
    print(value)
end
print("--------")
table.sort(t, function(a, b)
    if a>b then
        return true
    end
end)
for index, value in ipairs(t) do
    print(value)
end

输出:
2
3
5
5
6
--------
6
5
5
3
2

知道升序和降序用法即可,默认升序,使用a>b reutrn true可以修改为降序猜想排序function与冒泡排序有关

concat

lua 复制代码
t = { 5, 5, 2, 3, 6 }
str = table.concat(t,",")
print(str)

5,5,2,3,6

str = table.concat(t,",",2,5)
print(str)

5,2,3,6

使用table.concat方法,其返回值是字符串,所以我们拼接时只能用number和string类型的,此外别忘了需要把返回值赋值来接收最后处理的结果

相关推荐
Charles Ray9 分钟前
C++学习笔记 —— 内存分配 new
c++·笔记·学习
重生之我在20年代敲代码9 分钟前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记
我要吐泡泡了哦1 小时前
GAMES104:15 游戏引擎的玩法系统基础-学习笔记
笔记·学习·游戏引擎
骑鱼过海的猫1231 小时前
【tomcat】tomcat学习笔记
笔记·学习·tomcat
贾saisai3 小时前
Xilinx系FPGA学习笔记(九)DDR3学习
笔记·学习·fpga开发
北岛寒沫3 小时前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
烟雨666_java3 小时前
JDBC笔记
笔记
GEEKVIP3 小时前
Android 恢复挑战和解决方案:如何从 Android 设备恢复删除的文件
android·笔记·安全·macos·智能手机·电脑·笔记本电脑
铁匠匠匠5 小时前
从零开始学数据结构系列之第六章《排序简介》
c语言·数据结构·经验分享·笔记·学习·开源·课程设计
Moliay6 小时前
【资料分析】刷题日记2
笔记·公考·行测·常识·资料分析