Table — 白话Lua系列零基础教程 第七期
Posted 合宙Luat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Table — 白话Lua系列零基础教程 第七期相关的知识,希望对你有一定的参考价值。
大家好,时间过得真快,这是2019年度最后一期教程啦~
同时我们来个君子之约:先找到的同学,每人请只取一个券码使用哦,并请文末留言告知已使用几号券;让更多人享受福利,也减少大家“挖宝”尝试的时间。
时光不虚度,Lua伴我行~让我们开启新的内容吧!
还没有参与学习的朋友,可点击以下链接查看往期教程:
建议大家在阅读时多运行代码进行测试,以确保牢记和巩固知识点。为了方便测试Lua代码,我们提供了Lua在线调试网站:
https://chenxuuu.gitee.io/lua-online/
本教程为零基础教程,适合广大没有接触过Lua的用户进行阅读。
1
认识数组
数组,使用一个变量名,存储一系列的值。
很多语言中都有数组这个概念,在Lua中,我们可以使用table
(表)来实现这个功能。
在Lua中,table是一个一系列元素的集合,使用大括号进行表示,其中的元素之间以逗号分隔,类似下面的代码:
t = {1,3,8,5,4}
我们可以直接使用元素
的下标
,来访问、或者对该元素
进行赋值操作。
在上面的table
变量t
中,第一个元素的下标是1
,第二个是2
,以此类推。
我们可以用变量名
+中括号
,中括号里加上下标
,来访问或更改这个元素
,如下面的例子:
t = {1,3,8,5,4}
print(t[1]) --打印1
print(t[3]) --打印8
t[2] = 99 --更改第二个元素的值
print(t[2]) --打印99
t[6] = 2 --凭空新建第六个元素并赋值
print(t[6]) --打印2
print(t[10])
--因为不存在,打印nil
如无法正确显示,请将以下网址复制到浏览器测试:
以上就是table最简单的一个例子了,就是当作数组来用(注意,一般语言中的数组基本都为不可变长度,这里的table为可变长度)
下面你需要完成:
新建一个table,名为cards,存入1-10十个数字
将第3个元素与第7个元素交换
将第9个元素与第2个元素交换
增加第11个变量,值为23
惊喜1号券码:GWAUFE971381
--请补全代码
cards =
2
简单table
上一节里,我们将table
来表示数组
,实际上,table
中可以包括任意类型的数据
比如我们可以在table
中放置number
和string
数据,类似下面的代码:
t = {"abc",223,",..a",123123}
我们甚至能在里面放function
变量:
t = {
function() return 123 end,
function() print("abc") end,
function(a,b) return a+b end,
function() print("hello world") end, } t[1]() t[2]() t[3]() t[4]()
如无法正确显示,请将以下网址复制到浏览器测试:
这些table
访问每个元素的方式仍然是直接用下标,并且也能用下标来进行修改。
下面你需要完成:
新建一个
table
,名为funcList
,并实现以下功能调用
funcList[1](a,b)
,返回a和b的乘积调用
funcList[2](a,b)
,返回a减b的差调用
funcList[3](a)
,返回a的相反数(-a)
--请补全代码
funcList = { }
--同学,这是2号券码:GIPIYE639553
a,b = 1,2--提供两个数
print("a,b值为",a,b)
print("a和b的乘积:",funcList[1](a,b))
print("a和b的差:",funcList[2](a,b))
print("a和相反数:",funcList[3](a))
如无法正确显示,请将以下网址复制到浏览器测试:
3
table下标
在前两节,我们的table
都只是一些简单的List(列表),每个元素的下标
都是自动从1排列的。
实际上在Lua中,下标可以直接在声明时进行指定,像下面这样:
t = {6,7,8,9}
--上面和下面的代码等价
t = { [1] = 6, [2] = 7, [3] = 8, [4] = 9, }
--甚至你可以跳过某些下标
t = { [1] = 6, [3] = 7, [5] = 8, [7] = 9, }
print(t[7])
--输出9
--在声明后赋予元素值也是可以的
t = {}--空的table
t[101] = 10
print(t[101])
--输出10
--可以输出五折券吗?3号券码来了:HFIXSR610571
如无法正确显示,请将以下网址复制到浏览器测试:
https://chenxuuu.gitee.io/lua-online/?t%20%3D%20%7B6%2C7%2C8%2C9%7D%0A--%u4E0A%u9762%u548C%u4E0B%u9762%u7684%u4EE3%u7801%u7B49%u4EF7%0At%20%3D%20%7B%0A%20%20%20%20%5B1%5D%20%3D%206%2C%0A%20%20%20%20%5B2%5D%20%3D%207%2C%0A%20%20%20%20%5B3%5D%20%3D%208%2C%0A%20%20%20%20%5B4%5D%20%3D%209%2C%0A%7D%0A%0A--%u751A%u81F3%u4F60%u53EF%u4EE5%u8DF3%u8FC7%u67D0%u4E9B%u4E0B%u6807%0At%20%3D%20%7B%0A%20%20%20%20%5B1%5D%20%3D%206%2C%0A%20%20%20%20%5B3%5D%20%3D%207%2C%0A%20%20%20%20%5B5%5D%20%3D%208%2C%0A%20%20%20%20%5B7%5D%20%3D%209%2C%0A%7D%0Aprint%28t%5B7%5D%29%0A--%u8F93%u51FA9%0A%0A--%u5728%u58F0%u660E%u540E%u8D4B%u4E88%u5143%u7D20%u503C%u4E5F%u662F%u53EF%u4EE5%u7684%0At%20%3D%20%7B%7D--%u7A7A%u7684table%0At%5B101%5D%20%3D%2010%0Aprint%28t%5B101%5D%29%0A--%u8F93%u51FA10%0A
下面你需要:
新建一个变量t,并按下面的格式声明
下标为1的元素,值为123(number)
下标为13的元素,值为"abc"(string)
下标为666的元素,值为"666"(string)
你也可以先买买买,4号券码:OKGOJE392474
--请补全代码
t = { }
print("下标为1的元素:",t[1],type(t[1]))
print("下标为13的元素:",t[13],type(t[13]))
print("下标为666的元素:",t[666],type(t[666]))
如无法正确显示,请将以下网址复制到浏览器测试:
4
下标进阶
在上一节,我们学习了如何自定义下标,其实在Lua中,下标也可以是字符串,如下面的例子。
t = { ["apple"] = 10, banana = 12, pear = 6, }
--使用["下标"] = 值
--和 下标 = 值
--都是正确写法
--当第二种方式有歧义时,应该用第一种方式
--可以用下面两种方式访问:
print(t["apple"])
--输出10
print(t.apple)
--输出10
--当第二种方式有歧义时,应该用第一种方式
如无法正确显示,请将以下网址复制到浏览器测试:
https://chenxuuu.gitee.io/lua-online/?t%20%3D%20%7B%0A%20%20%20%20%5B%22apple%22%5D%20%3D%2010%2C%0A%20%20%20%20banana%20%3D%2012%2C%0A%20%20%20%20pear%20%3D%206%2C%0A%7D%0A--%u4F7F%u7528%5B%22%u4E0B%u6807%22%5D%20%3D%20%u503C%0A--%u548C%20%20%u4E0B%u6807%20%3D%20%u503C%0A--%u90FD%u662F%u6B63%u786E%u5199%u6CD5%0A--%u5F53%u7B2C%u4E8C%u79CD%u65B9%u5F0F%u6709%u6B67%u4E49%u65F6%uFF0C%u5E94%u8BE5%u7528%u7B2C%u4E00%u79CD%u65B9%u5F0F%0A%0A--%u53EF%u4EE5%u7528%u4E0B%u9762%u4E24%u79CD%u65B9%u5F0F%u8BBF%u95EE%uFF1A%0Aprint%28t%5B%22apple%22%5D%29%0A--%u8F93%u51FA10%0Aprint%28t.apple%29%0A--%u8F93%u51FA10%0A--%u5F53%u7B2C%u4E8C%u79CD%u65B9%u5F0F%u6709%u6B67%u4E49%u65F6%uFF0C%u5E94%u8BE5%u7528%u7B2C%u4E00%u79CD%u65B9%u5F0F%0A
可见,在使用string
作为下标时,table
的灵活性提升了一共数量级。
string
作为下标时,也可以动态赋值:
t = {} -- 空table
t["new"] = "新的值"
print(t.new)
--输出 新的值
如无法正确显示,请将以下网址复制到浏览器测试:
下面你需要完成:
新建table变量t
下标为apple的元素,值为123(number)
下标为banana的元素,值为"abc"(string)
下标为1@1的元素,值为"666"(string)
--请补全代码
t = { }
print("下标为apple的元素:",t["apple"],type(t["apple"]))
print("下标为banana的元素:",t["banana"],type(t["banana"]))
print("下标为1@1的元素:",t["1@1"],type(t["1@1"]))
--嗨~我是5号券码:KSPAAF395395
如无法正确显示,请将以下网址复制到浏览器测试:
https://chenxuuu.gitee.io/lua-online/?--%u8BF7%u8865%u5168%u4EE3%u7801%0At%20%3D%20%7B%0A%0A%7D%0A%0Aprint%28%22%u4E0B%u6807%u4E3Aapple%u7684%u5143%u7D20%uFF1A%22%2Ct%5B%22apple%22%5D%2Ctype%28t%5B%22apple%22%5D%29%29%0Aprint%28%22%u4E0B%u6807%u4E3Abanana%u7684%u5143%u7D20%uFF1A%22%2Ct%5B%22banana%22%5D%2Ctype%28t%5B%22banana%22%5D%29%29%0Aprint%28%22%u4E0B%u6807%u4E3A1@1%u7684%u5143%u7D20%uFF1A%22%2Ct%5B%221@1%22%5D%2Ctype%28t%5B%221@1%22%5D%29%29%0A
5
table小测验1
下面的代码,将会打印什么?
t = { apple = { price = 7.52, weight = 2.1, }, banana = { price = 8.31, weight = 1.4, year = '2018' }, year = '2019'}print( t.price, t.apple.price, t.banana.weight, t.year )
如无法正确显示,请将以下网址复制到浏览器测试:
https://chenxuuu.gitee.io/lua-online/?t%20%3D%20%7B%0A%20%20%20%20apple%20%3D%20%7B%0A%20%20%20%20%20%20%20%20price%20%3D%207.52%2C%0A%20%20%20%20%20%20%20%20weight%20%3D%202.1%2C%0A%20%20%20%20%7D%2C%0A%20%20%20%20banana%20%3D%20%7B%0A%20%20%20%20%20%20%20%20price%20%3D%208.31%2C%0A%20%20%20%20%20%20%20%20weight%20%3D%201.4%2C%0A%20%20%20%20%20%20%20%20year%20%3D%20%272018%27%0A%20%20%20%20%7D%2C%0A%20%20%20%20year%20%3D%20%272019%27%0A%7D%0Aprint%28%0A%20%20%20%20t.price%2C%0A%20%20%20%20t.apple.price%2C%0A%20%20%20%20t.banana.weight%2C%0A%20%20%20%20t.year%0A%29%0A
6
table小测验2
下面的代码,将会打印什么?
t = { { price = 7.52, weight = 2.1, }, { price = 8.31, weight = 1.4, year = '2018' }, year = '2019'}print( t["price"], t[1].price, t[2].weight, t["year"] )
如无法正确显示,请将以下网址复制到浏览器测试:
https://chenxuuu.gitee.io/lua-online/?t%20%3D%20%7B%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20price%20%3D%207.52%2C%0A%20%20%20%20%20%20%20%20weight%20%3D%202.1%2C%0A%20%20%20%20%7D%2C%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20price%20%3D%208.31%2C%0A%20%20%20%20%20%20%20%20weight%20%3D%201.4%2C%0A%20%20%20%20%20%20%20%20year%20%3D%20%272018%27%0A%20%20%20%20%7D%2C%0A%20%20%20%20year%20%3D%20%272019%27%0A%7D%0Aprint%28%0A%20%20%20%20t%5B%22price%22%5D%2C%0A%20%20%20%20t%5B1%5D.price%2C%0A%20%20%20%20t%5B2%5D.weight%2C%0A%20%20%20%20t%5B%22year%22%5D%0A%29%0A
7
Lua全局变量与table
在前面我们知道了,在table
中,可以直接用table名[下标]
或table名.string下标
来访问元素。
实际上,在Lua中,所有的全局变量全部被存放在了一共大table
中,这个table
名为:_G
我们可以用下面的例子来示范:
n = 123--新建变量
print(n)--输出123
print(_G.n)--输出123
_G.abc = 1--相当于新建全局变量
print(abc)--输出1
_G["def"] = 23--相当于新建全局变量
print(def)--输出23
--甚至你可以像下面这样
_G.print("hello")
_G["print"]("world")
如无法正确显示,请将以下网址复制到浏览器测试:
https://chenxuuu.gitee.io/lua-online/?n%20%3D%20123--%u65B0%u5EFA%u53D8%u91CF%0Aprint%28n%29--%u8F93%u51FA123%0Aprint%28_G.n%29--%u8F93%u51FA123%0A%0A_G.abc%20%3D%201--%u76F8%u5F53%u4E8E%u65B0%u5EFA%u5168%u5C40%u53D8%u91CF%0Aprint%28abc%29--%u8F93%u51FA1%0A%0A_G%5B%22def%22%5D%20%3D%2023--%u76F8%u5F53%u4E8E%u65B0%u5EFA%u5168%u5C40%u53D8%u91CF%0Aprint%28def%29--%u8F93%u51FA23%0A%0A--%u751A%u81F3%u4F60%u53EF%u4EE5%u50CF%u4E0B%u9762%u8FD9%u6837%0A_G.print%28%22hello%22%29%0A_G%5B%22print%22%5D%28%22world%22%29%0A
现在,你明白为什么说万物基于table
了吧?
6号券码请领取:YRFUBW387109
你需要完成下面的任务:
已知有一个全局变量,名为
@#$
请新建一个变量
result
将
@#$
变量里的值赋值给result
_G["@#$"] = 123
result = --请补全代码
print("result值为",result)
如无法正确显示,请将以下网址复制到浏览器测试:
https://chenxuuu.gitee.io/lua-online/?_G%5B%22@%23%24%22%5D%20%3D%20123%0A%0Aresult%20%3D%20--%u8BF7%u8865%u5168%u4EE3%u7801%0Aprint%28%22result%u503C%u4E3A%22%2Cresult%29%0A
8
table小测验3
请新建一个名为t的table,满足以下要求
t[10]
可获得number
类型数据100
t.num
可获得number
类型数据12
t.abc[3]
可获得string
类型数据abcd
t.a.b.c
可获得number
类型数据789
--请补全代码
t = { }
--7号券码在这里:CUBPYC397124
print("t[10]可获得number类型数据100:",t[10],type(t[10]))
print("t.num可获得number类型数据12:",t.num,type(t.num))
print("t.abc[3]可获得string类型数据abcd:",t.abc[3],type(t.abc[3]))
print("t.a.b.c可获得number类型数据789:",t.a.b.c,type(t.a.b.c))
如无法正确显示,请将以下网址复制到浏览器测试:
https://chenxuuu.gitee.io/lua-online/?--%u8BF7%u8865%u5168%u4EE3%u7801%0At%20%3D%20%7B%0A%0A%7D%0A%0Aprint%28%22t%5B10%5D%u53EF%u83B7%u5F97number%u7C7B%u578B%u6570%u636E100%3A%22%2Ct%5B10%5D%2Ctype%28t%5B10%5D%29%29%0Aprint%28%22t.num%u53EF%u83B7%u5F97number%u7C7B%u578B%u6570%u636E12%3A%22%2Ct.num%2Ctype%28t.num%29%29%0Aprint%28%22t.abc%5B3%5D%u53EF%u83B7%u5F97string%u7C7B%u578B%u6570%u636Eabcd%3A%22%2Ct.abc%5B3%5D%2Ctype%28t.abc%5B3%5D%29%29%0Aprint%28%22t.a.b.c%u53EF%u83B7%u5F97number%u7C7B%u578B%u6570%u636E789%3A%22%2Ct.a.b.c%2Ctype%28t.a.b.c%29%29%0A
9
table.concat
table.concat (table [, sep [, i [, j ] ] ])
将元素是string
或者number
类型的table
,每个元素连接起来变成字符串并返回。
可选参数sep
,表示连接间隔符,默认为空。
i
和j
表示元素起始和结束的下标。
下面是例子:
local a = {1, 3, 5, "hello" }
print(table.concat(a))
print(table.concat(a, "|"))
-->打印的结果:
--135hello
--1|3|5|hello
--看这里,8号券码来了:OUPCKU222446
如无法正确显示,请将以下网址复制到浏览器测试:
https://chenxuuu.gitee.io/lua-online/?local%20a%20%3D%20%7B1%2C%203%2C%205%2C%20%22hello%22%20%7D%0Aprint%28table.concat%28a%29%29%0Aprint%28table.concat%28a%2C%20%22%7C%22%29%29%0A%0A--%3E%u6253%u5370%u7684%u7ED3%u679C%uFF1A%0A--135hello%0A--1%7C3%7C5%7Chello%0A
请完成下面的任务:
已知table变量t,
将t中的结果全部连起来
间隔符使用
,
并使用print打印出来
t = {"a","b","c","d"}
print("连接结果:")
--补全代码
如无法正确显示,请将以下网址复制到浏览器测试:
https://chenxuuu.gitee.io/lua-online/?t%20%3D%20%7B%22a%22%2C%22b%22%2C%22c%22%2C%22d%22%7D%0Aprint%28%22%u8FDE%u63A5%u7ED3%u679C%uFF1A%22%29%0A--%u8865%u5168%u4EE3%u7801%0A
10
table删减
table.insert (table, [pos ,] value)
在(数组型)表 table 的 pos 索引位置插入 value,其它元素向后移动到空的地方。pos 的默认值是表的长度加一,即默认是插在表的最后。
table.remove (table [, pos])
在表 table 中删除索引为 pos(pos 只能是 number 型)的元素,并返回这个被删除的元素,它后面所有元素的索引值都会减一。pos 的默认值是表的长度,即默认是删除表的最后一个元素。
下面是例子:
同学,速领9号券码:WKASTF273244
local a = {1, 8} --a[1] = 1,a[2] = 8
table.insert(a, 1, 3) --在表索引为1处插入3
print(a[1], a[2], a[3])
table.insert(a, 10) --在表的最后插入10
print(a[1], a[2], a[3], a[4])
-->打印的结果:
--3 1 8
--3 1 8 10
local a = { 1, 2, 3, 4}
print(table.remove(a, 1)) --删除速索引为1的元素
print(a[1], a[2], a[3], a[4])
print(table.remove(a)) --删除最后一个元素
print(a[1], a[2], a[3], a[4])
-->打印的结果:
--1
--2 3 4 nil
--4
--2 3 nil nil
如无法正确显示,请将以下网址复制到浏览器测试:
https://chenxuuu.gitee.io/lua-online/?local%20a%20%3D%20%7B1%2C%208%7D%20%20%20%20%20%20%20%20%20%20%20%20%20--a%5B1%5D%20%3D%201%2Ca%5B2%5D%20%3D%208%0Atable.insert%28a%2C%201%2C%203%29%20%20%20--%u5728%u8868%u7D22%u5F15%u4E3A1%u5904%u63D2%u51653%0Aprint%28a%5B1%5D%2C%20a%5B2%5D%2C%20a%5B3%5D%29%0Atable.insert%28a%2C%2010%29%20%20%20%20--%u5728%u8868%u7684%u6700%u540E%u63D2%u516510%0Aprint%28a%5B1%5D%2C%20a%5B2%5D%2C%20a%5B3%5D%2C%20a%5B4%5D%29%0A%0A--%3E%u6253%u5370%u7684%u7ED3%u679C%uFF1A%0A--3%20%20%20%201%20%20%20%208%0A--3%20%20%20%201%20%20%20%208%20%20%20%2010%0A%0A%0Alocal%20a%20%3D%20%7B%201%2C%202%2C%203%2C%204%7D%0Aprint%28table.remove%28a%2C%201%29%29%20--%u5220%u9664%u901F%u7D22%u5F15%u4E3A1%u7684%u5143%u7D20%0Aprint%28a%5B1%5D%2C%20a%5B2%5D%2C%20a%5B3%5D%2C%20a%5B4%5D%29%0A%0Aprint%28table.remove%28a%29%29%20%20%20--%u5220%u9664%u6700%u540E%u4E00%u4E2A%u5143%u7D20%0Aprint%28a%5B1%5D%2C%20a%5B2%5D%2C%20a%5B3%5D%2C%20a%5B4%5D%29%0A%0A--%3E%u6253%u5370%u7684%u7ED3%u679C%uFF1A%0A--1%0A--2%20%20%20%203%20%20%20%204%20%20%20%20nil%0A--4%0A--2%20%20%20%203%20%20%20%20nil%20%20%20%20nil%0A
请完成下面的任务:
已知table变量
t
,去除t中的第一个元素
然后这时,在t的第三个元素前,加上一个number变量,值为810
t = {1,2,3,4,5,6,7,8,9}
--补全代码
print("第一个元素应为2:",t[1])
print("第三个元素应为810:",t[3])
如无法正确显示,请将以下网址复制到浏览器测试:
https://chenxuuu.gitee.io/lua-online/?t%20%3D%20%7B1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%7D%0A%0A--%u8865%u5168%u4EE3%u7801%0A%0Aprint%28%22%u7B2C%u4E00%u4E2A%u5143%u7D20%u5E94%u4E3A2%uFF1A%22%2Ct%5B1%5D%29%0Aprint%28%22%u7B2C%u4E09%u4E2A%u5143%u7D20%u5E94%u4E3A810%uFF1A%22%2Ct%5B3%5D%29%0A
以上就是table相关的内容
你都掌握了吗
下一期2020年见啦
以下参与“稀饭放姜”名称含义竞猜的同学
快来领奖哦
柴松
砖家的砖
朱亮~漂流人生
精彩昊Sir
金宗林
珍重
请于2020.01.10前
点击下图或文末“阅读原文”
- 粉丝专有福利 -
- 往期官方教程 -
刘晨旭白话Lua零基础系列教程:
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
细心的你一定发现前面只有9个券码对不对?
第10个券码在这里哦:UXMKPV516282
点亮在看,和更多人一起了解物联网
↓↓↓
以上是关于Table — 白话Lua系列零基础教程 第七期的主要内容,如果未能解决你的问题,请参考以下文章