如何更新/重新加载表中的键值

如何使用另一个作为变量的键值更新键值,其在同一张表内?

local t = {}
t.playerPosition = {x = 0, y = 0, z = 0}
t.positions = {t.playerPosition.x + 1, t.playerPosition.y + 1, t.playerPosition.z + 1}

然后几行后我更新了 playerPosition

t.playerPosition = {x = 125, y = 50, z = 7}

然后如果我打印输出...

结果

t.positions[1] -- 输出 1
t.positions[2] -- 输出 1
t.positions[3] -- 输出 1

预期结果

t.positions[1] -- 输出 126
t.positions[2] -- 输出 51
t.positions[3] -- 输出 8

你可以看到键 positions 没有被更新,我应该怎么做才能让它更新?

原文链接 https://stackoverflow.com/questions/70601075

点赞
stackoverflow用户2505965
stackoverflow用户2505965
t.positions = {t.playerPosition.x + 1, t.playerPosition.y + 1, t.playerPosition.z + 1}

在上面的代码中,表达式只会被评估一次,评估的结果会被赋值给子表中的字段。在此之后,对t.playerPosition中的字段进行更改不会导致t.positions中的相应变化。

可以使用元表来启用此类行为,通过在访问t.positions的字段时动态计算结果。

local t = {}
t.playerPosition = { x = 0, y = 0, z = 0 }
t.positions = setmetatable({}, {
        __newindex = function () return false end,
        __index = function (_, index)
            local lookup = { 'x', 'y', 'z' }
            local value = t.playerPosition[lookup[index]]

            if value then
                return value + 1
            end
        end
})

print(t.positions[1], t.positions[2], t.positions[3])
t.playerPosition = {x = 125, y = 50, z = 7}
print(t.positions[1], t.positions[2], t.positions[3])
2022-01-06 01:18:25