Search code examples
lualua-table

I don't Understand "How Lua save data on the same variable when we Iterate over it"


I know Lua remember value in the same field/function with the Same defined Variable. but I still lack the concept behind it. Let's say I'see Int Variable = 2 which can be modify if we iterate over it Int variable = 8

Same logic I was applying on the Code. I got the results, but I didn't understand the concept behind it.

You Can see in my Code I was saving some value in Var x and saveX

and I was doing saveX = x from my logic The value of x should be saved inside saveX instead it was saving the loop value as I'm applying over it. Why is that?

-- Graphical Representation of table1
--[[ { {  {},{},{},{}  },
       {  {},{},{},{}  },
       {  {},{},{},{}  },
       {  {},{},{},{}  }  }  ]]

_Gtable1 = {}

for y = 1, 4 do

    table.insert(_Gtable1, {})
    for x = 1, 4 do
        table.insert(_Gtable1[y], {
            x = (x - 1) * 10, --Coordinate value of X
            y = (y - 1) * 10, --Coordinate value of Y

            -- what if i want to save Coordinate value on another variable How should i do?

            saveX = x, -- Saving Loop X
            saveY = y, -- Saving Loo Y

            t = "Check" -- to Debug

        })
    end
end
ti = _Gtable1

for y = 1, 4 do
    for x = 1, 4 do
        tim = ti[y][x]
        -- print(tim.saveX) -- output 1, 2, 3, 4
        print(tim.x) -- output 0, 10, 20, 30

    end
end

Solution

  • I hope I understood the question:

    Let's simplify the example:

    local t = {
        x = 10,
        y = x,
    }
    

    You assume t.y is 10, because you declared it a line before that? But it is nil here, because x = 10, is no variable. It's part of the table constructor and can not be referenced in the same constructor. Check out https://www.lua.org/pil/3.6.html for more details.

    After the constructor has finished, you can access that as t.x (not x!).

    Now for your example, you need to move (x - 1) * 10 outside the constructor, e.g.: local tempX = (x - 1) * 10. Then use tempX inside the constructor. Or you can set your values individually, e.g. _Gtable1[y][x].saveX = _Gtable1[y][x].x. I would prefer the former.