Lua之table

1.table 介绍

什么是 table?

table 是 Lua 语言中的一种“数据/代码结构”,可以用来帮助我们创建不同的“数据类型”。
其实我们之前讲解的 Lua 语言版本的数组,这个数组是什么类型?

Lua 语言中的数组其实就是 table 类型。
案例:创建一个 Lua 版本的数组,然后用 type 方法获取数组的数据类型. 我们之前讲解的 lua 当中的 string,number,boolean,这三个是 Lua 当中的基本数据类型;而 table 也是数据类型,只不过是稍微高级一点的数据类型。后续很多知识点,都是建立在 table 的基础之上的:
比如后面的 Lua 语言的面向对象,就是通过 table 的格式进行实现的

table 和数组的关系

table是Lua 语言中的一种“代码格式结构”,而 Lua当中的数组就是使用table这种结构实现的。
举例说明:
table 好比是面粉,数组好比是馒头,馒头是用面粉做的。但是面粉不单单可以做馒头,还可以做面条,做油条…

2.table 基本使用

1.table 基本使用

<1>初始化 table
table 表名 = { }

<2>给 table 赋值
有两种操作:
1.数组方式,就是以角标方式进行赋值,1,2,3,4,5… (注意角标从1开始)
2.键值对方式,类似于 C#当中的 Dictionary<k, v>泛型字典。
(直接赋值就行)

<3>迭代器方式遍历 table

for key, value in ipairs(表名) do
print(key, value)
end

备注:如果是数组结构,用 ipairs 方法;如果是键值对结构,用 pairs 方法

2.table 相关方法

<1>增加元素
table.insert(表名, [位置], 值)
往指定的位置增加元素,如果不写位置,默认往最后一个位置增加(只填两个参数)。如果超出范围则不会添加。
这个方式适合“数组模式”,不太适合“键值对模式”。
键值对就用:表名[‘键’] = 值 的方式添加即可。

<2>移除元素
table.remove(表名, [位置])
如果不写位置,默认移除最后一个元素,如果位置值超出范围,不会报错,也不会有元素被移除。
这个方式适合“数组模式”,不能用于“键值对模式”。
键值对就用:表名[‘键’] = nil 的方式移除即可。

<3>table 长度
table.getn(表名)
返回 table 表的长度。
这个方式适合“数组模式”,不能用于“键值对模式”。
键值对就用:迭代器迭代,然后累加一个变量的方式获得长度。

index = 0
for key, value in ipairs(表名) do
index = index + 1
end

3.模块

1.模块简介

1.什么是模块?
将一些常用的函数封装到一个独立 lua 脚本中,然后提供给其他的 lua 脚本访问使用,这种方式,在 Lua 语言中,就叫做模块。
模块当中基本的成员就是变量和函数。
Lua 语言中的模块在功能上其实类似于 C#当中我们写一个静态的工具类。

2.扩展理解
在 C#当中有命名空间的概念,当我们需要使用到某些特殊的类的时候,就需要引入对应的命名空间。Lua 当中的模块,在语法格式上类似于命名空间,都是需要引入才能使用。

2.模块基本使用

1.创建模块
①创建一个新的 lua 脚本,并命名;
②初始化模块;[模块其实也是 table 的代码格式,说白了就是初始化一个 table]
③在模块中定义变量和函数;
④模块的最后要写 return 模块名
备注:在定义变量和函数的时候,名称前面必须加“模块名.”;
最终格式:模块名.变量名 模块名.函数名。

2.使用模块
①引入模块 require(“模块名”) 或者 require “模块名”
②访问变量;
③访问方法

代码示例:
创建两个脚本,通过require调用到另一个脚本中的内容,类似C#的using

rt = {};
rt.name = "test"
function rt.Test(a,b)
print(a + b)
end
require "RequireTest"
print(rt.name)
rt.Test(10,10)

输出为:
test
20

4.Metatable 元表

1.元表介绍

如果想同时操作两个 table,就需要让两个 table 之间发生“关联”,这里需要用到一个新的知识点,这个知识点叫做:元表。

元表(metatable)就是让两个表之间产生“附属”关系,只需要操作主表,就可以间接的操作元表。

在 Lua 语言中模拟“面向对象”,元表也是一个很关键且不可或缺的知识点。

2.元表基本操作

1.元表基本语法
<1>实例化两个普通表[表 A 和表 B];
<2>关联两个表[将表 B 设置成表 A 的元表],需要用一个新的函数:
setmetatable(表 A, 表 B)
<3>getmetatable(表名)
如果表名有元表,就返回元表的类型和地址;如果没有元表,则返回一个 nil。

metaA = {}
metaB = {}

setmetatable(metaA,metaB)
print(getmetatable(metaA))

--如果metaA是元表的话则输出地址

2.__index 索引
案例情况分析:
<1>表 A 内有自己键值对元素,表 B 内也有自己的键值对元素,同时表 B 还是表 A 的元表,两个表建立了“从属关系”,一般我们都是直接访问表 A。
<2>我们可以直接通过“表名.键名”的方式访问表 A 中的成员,但是元表内的成员,我们是访问不到的,会返回 nil。
<3>如何通过“表名.键名”直接访问到元表中的成员哪???我们需要设置元表的“__index 索引”,让这个索引指向元表自身,代码如下:
元表名.__index = 元表名
<4>设置完毕__index 索引后,我们再使用“表名.键名”的方式访问成员,如果表A 中没有,就会自动访问表 B 中的成员。

metaA = {num = 10,num2 = 11}
metaB = {s1 = "a",s2 = "b"}

setmetatable(metaA,metaB)

--虽然metaB为metaA的附属关系,但是不能直接通过metaA访问到metaB
--需要将元表索引指向自身,不然会输出nil
metaB.__index = metaB 

print(metaA.s1)
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我寄人间雪满头丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值