创建table我目前知道三种方式
方法一:
a = {}
a["x"] = 10
a[2.0] = "great"
a[-1] --> 值为nil
a[2] = nil --> 删除a[2.0]
方法二:
days ={x = 10, y = 20, "Sunday", "Monday", "Tuesday", {"Wednesday", "Thursday", "Friday", "Saturday"}}
days[1] --> Sunday
days[4] --> {"Wednesday", "Thursday", "Friday", "Saturday"}
a.x --> 10
a.y --> 20
默认索引从1开始
方法三:
a = {["+"] = "add", [-1] = "-1"} -->
可以使用任意类型作为索引(可转换为整形的浮点型会被转换)
感觉有点像是字典?
表永远是匿名的,即a只是指向表的引用对象,并非表本身。
eg:
b = a
b["x"] = -10
a["x"] --> 10
a = nil --只有b指向表
若无引用指向表,Lua的垃圾收集器最终给会自动释放其对应内存。
与字典不同来了:
当把表当作结构体使用时, 可以把索引当作成员名称使用。
eg:
a.x = 10 -- 等价于a["x"] = 10
两种形式可自由混用(但后者一般用于表的键为预先定义的、固定的情况)。
注意:
不要混淆a.x和a[x]
eg:
x = "y"
a[x] = 10 -- 等价于a["y"] = 10和a.y = 10
table的一种特殊形式为列表(索引为整型)
eg:
a = { 1, 3, 2, 4 }
计算列表的长度有一个坑就是有nil的列表长度该如何计算的问题:
eg:
a = { 1, nil, 3, 4 }
print(#a) --> 4
a = { 1, nil, 3, 4, nil }
print(#a) --> 1
关于这个长度计算方法我也暂时还没理解,推荐的做法是在含有nil的列表中显式地保存列表的长度而不使用#操作符计算。
遍历表的方式有如下几种
- pairs
eg:
t = { 10, print, x = 12, k = "hi" }
for k, v in pairs(t) do
print(k, v)
end
输出为:
书上说pairs遍历table顺序是随机的(虽然我每次输出都是顺序的)。
- ipairs
遍历列表时可使用ipairs,输出为顺序的(这个确实,但是如果用iparis遍历普通table只会按序输出连续的整数键)。
eg:
t = { [2] = 10, print, [4] = 12, k = "hi" }
for k, v in ipairs(t) do
print(k, v)
end
输出为:
- for
for循环当然也是可以滴
t = { 10, print, 12, "hi" }
for k = 1, #t do
print(k, t[k])
end
输出为: