I’ve created a sample project here which demonstrates a Lua module where the table pass by reference is disregarded. See test.lua module. If I modify the function to return t2 and store it to t then the function behaves as expected. Can anyone explain this to me?
function scrub_tombstones(t, tombstone)
local t2 = {}
for k,v in pairs(t) do
if v ~= tombstone then
t2[k] = v
else
pprint("tombstone scrubbed")
end
end
t = t2
end
t = {1, 2, 3, 4, 5}
scrub_tombstones(t, 3)
pprint(t)
This is a classic example of variable shadowing. The first argument “t” in scrub_tombstones is local to the function and “shadows” the global variable “t”. When you do t = t2 you replace the local reference and not the global “t” declared outside the function.
This is also an example of why you should avoid using global variables (and functions!).
Thank you, this is something I have to watch out for :blush luckily I have been testing things so I caught this before it became an issue. It’s one thing that bothers me slightly about Lua though for certain. I’ll try to write my code in a more functional style to avoid stuff like this.