关于Lua的table.insert and pairs(t)的发现(不知道真假)

在学习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 ^

你可能感兴趣的:(Lua)