Lua中table.insert未插入首个nil位置的原因咨询
Lua中
table.insert不指定索引时的插入行为解析 最近开始学习Lua,原本以为不指定索引时,table.insert函数会将值插入到表的首个nil位置。但测试发现:表t中10被插入到索引4,表y中10被插入到索引2,表x中10被插入到索引5。
测试代码
local t = {1, nil, 2} table.insert(t,10) for i = 1, 6 do print(string.format("t[%d] = %s", i, t[i])) end print() local y = {1, nil, 2} y[5]= 3 table.insert(y, 10) for i = 1, 6 do print(string.format("y[%d] = %s", i, y[i])) end print() local x = {1, nil, 2} table.insert(x,2,20) x[6]= 3 table.insert(x,10) for i = 1, 6 do print(string.format("x[%d] = %s", i, x[i])) end
终端输出
t[1] = 1 t[2] = nil t[3] = 2 t[4] = 10 t[5] = nil t[6] = nil y[1] = 1 y[2] = 10 y[3] = 2 y[4] = nil y[5] = 3 y[6] = nil x[1] = 1 x[2] = 20 x[3] = nil x[4] = 2 x[5] = 10 x[6] = 3
差异原因分析
核心逻辑是:不指定索引调用table.insert(t, value)时,Lua会将值插入到#t + 1的位置,而#t(表的长度运算符)的计算规则并非简单寻找首个nil,而是遵循以下规则:
- 如果表是序列(从索引1开始连续非nil,直到某个整数n,且
t[n+1]为nil),#t就是序列的长度n,插入位置固定为n+1。 - 如果表不是序列(存在“空洞”:中间有nil元素,且空洞之后还有非nil元素),
#t的结果是未定义的——Lua会选择任意一个满足t[n] ~= nil且t[n+1] == nil的整数n,具体选哪个由Lua的实现决定。
针对三个测试案例的具体解释:
- 表
t:表中t[3] ~= nil且t[4] == nil,同时t[1] ~= nil且t[2] == nil,理论上#t可以是1或3。测试环境中#t返回了3,因此插入位置为3+1=4。 - 表
y:添加y[5] = 3后,表中存在多个符合条件的n:1(y[1]非nil,y[2]nil)、3(y[3]非nil,y[4]nil)、5(y[5]非nil,y[6]nil)。测试环境中#y返回了1,因此插入位置为1+1=2。 - 表
x:执行table.insert(x,2,20)后,表变为{1, 20, nil, 2},添加x[6] = 3后,x[4] ~= nil且x[5] == nil,#x返回4,因此插入位置为4+1=5。
内容的提问来源于stack exchange,提问作者Rafael
相关产品推荐
相关产品推荐

