I'm trying to re-write the table.insert function. Since table.insert uses rawset (which is the reason it doesn't invoke any metamethods), I'm trying to make my own table.insert function that sets a value to a table by creating a new index. Here's the problem:
My problem with this, is table.insert's second argument as it's position. When using the second argument as the position you're giving the value, table.insert pushes all other values up the list by 1. For example:
local t = {'a','b','c'}
table.insert(t,1,'z') -- this is basically what I'm trying to re-create
print(unpack(t)) -- output: 'z' 'a' 'b' 'c'
I've attempted to make a function for this, but only got this far:
local t = {'a','b','c'}
-- Basically just making a new reference to the table library, and a separate one for the insert function.
local table=setmetatable({},{
__index=function(tab,k)
if(k=='insert')then
return function(tab,pos,val)
if(type(pos)=='number')and(val)then
local n=0
for i=pos,#tab do
tab[i+1]=tab[i+n] -- the problem?
n=n+1
end
tab[pos]=val
elseif(pos)and(not val)then
-- in this case, "pos" is the value
tab[#tab+1]=pos
end
end
else
-- If it's not the insert function, return the default from the given index.
return table[k]
end
end
})
table.insert(t,1,'z')
-- The insert function above outputs:
-- 1 z
-- 2 a
-- 3 c
-- When it should be:
-- 1 z
-- 2 a
-- 3 b
-- 4 c
Or maybe the problem is with my for loop iterations, but I'm not sure.
So basically, I could shorten the question to this:
How could I make a function that can push each value in a list's numeric index, up by 1?
This has REALLY been an issue for me, and would help a lot considering I'm in specific need of something like this. Any small example or algorithm with minimal explanation would be very much appreciated. Thank you for reading.
