在学习Lua元表的时候遇到:
-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用
-- 自定义计算表中最大键值函数 table_maxn,即计算表的元素个数
function table_maxn(t)
local mn = 0
for k, v in pairs(t) do
if mn < k then
mn = k
end
end
return mn
end
-- 两表相加操作
mytable = setmetatable({ 1, 2, 3 }, {
__add = function(mytable, newtable)
for i = 1, table_maxn(newtable) do
table.insert(mytable, table_maxn(mytable)+1,newtable[i])
end
return mytable
end
})
secondtable = {4,5,6}
mytable = mytable + secondtable
for k,v in ipairs(mytable) do
print(k,v)
end
这个不难理解:
就是输出1到6
1 1
2 2
3 3
4 4
5 5
6 6
但是当我把secondtable的5改成nil的时候:
secondtable = {4,nil,6}
输出变成了
1 1
2 2
3 3
4 4
5 6
左思右想也搞不明白
去看了insert跟pairs的文档:
table.insert (list, [pos,] value)
在 list 的位置 pos 处插入元素 value , 并后移元素 list[pos], list[pos+1], ···,
list[#list] 。 pos 的默认值为 #list+1 , 因此调用 table.insert(t,x) 会将 x 插在列表 t
的末尾。
pairs (t)
如果 t 有元方法 __pairs, 以 t 为参数调用它,并返回其返回的前三个值。
否则,返回三个值:next 函数, 表 t,以及 nil。 因此以下代码
for k,v in pairs(t) do body end
能迭代表 t 中的所有键值对。
参见函数 next 中关于迭代过程中修改表的风险。
也没说到关于nil的事情所以我提出了以下两个设想(说不定是我没仔细学习漏了前面的知识):
--设想:
--1.table.insert 不能插入nil
测试代码:
t1 = {1,2,3,4}
print('t1: before insert :' .. table.concat(t1,' , '))
table.insert(t1,nil)
print('t1: insert nil :' .. table.concat(t1,' , '))
table.insert(t1,5)
print('t1: insert 5 :' .. table.concat(t1,' , '))
输出为:
t1: before insert :1 , 2 , 3 , 4
t1: insert nil :1 , 2 , 3 , 4
t1: insert 5 :1 , 2 , 3 , 4 , 5
可见:不能插入nil?
--设想:
--2.pairs不输出nil
测试代码:
t2 = {1,2,3,nil,5}
print(t2[4]) --此处看看是不是输出nil , 确实输出nil
for k,v in pairs(t2) do
print(k .. ':' .. v)
end
输出如下:
nil --print(t2[4])
1:1
2:2
3:3
5:5
可见 : 不能输出nil?
如上??大伙觉得对吗?不对跟我说一下呗 ^ u ^