Lua 在给定一个键表的嵌套表中,是否有一种非黑客方式来更改值?

Lua 在给定一个键表的嵌套表中,是否有一种非黑客方式来更改值?,lua,lua-table,Lua,Lua Table,所以我试图在给定键表的嵌套表中更改一个值 例如: 本地数据={ 存储={ 个人识别码={ 货币=0; 存货={ 第1项=0; } } } } 本地函数ChangeData(ID、键表、值、操作) 本地存储值=数据。存储[ID]。数据; 对于u,输入IPAIR(KeyTable)do StorageValue=StorageValue[键]; 结束 如果操作==“+”则 StorageValue=StorageValue+Value; elseif操作==“=”然后 储存价值=价值; 结束 结束

所以我试图在给定键表的嵌套表中更改一个值

例如:

本地数据={
存储={
个人识别码={
货币=0;
存货={
第1项=0;
}
}
}
}
本地函数ChangeData(ID、键表、值、操作)
本地存储值=数据。存储[ID]。数据;
对于u,输入IPAIR(KeyTable)do
StorageValue=StorageValue[键];
结束
如果操作==“+”则
StorageValue=StorageValue+Value;
elseif操作==“=”然后
储存价值=价值;
结束
结束
ChangeData(“person_id”,{“Money”},5,=”};
ChangeData(“person_id”,{“Inventory”,“Item1”},5,=”};
这可以成功地从嵌套表中获取值(并更改变量值),但不会更改嵌套表中的值

解决这个问题的唯一方法(我真的不想这么做)是硬编码。 例:

如果操作==”则
如果#KeyTable==1,则
DATA.Storage[ID].DATA[KeyTable[1]]=值;
elseif#KeyTable==2那么
DATA.Storage[ID].DATA[KeyTable[1]][KeyTable[2]]=Value;
--……等等

因此,我要问的是:有没有一种非黑客方法可以在给定键表的嵌套表中更改值?

您可以使用
表删除表的最后一个值。删除
,并将其另存为最后一个键

然后您可以按原样使用代码,只需将最后一个键索引添加到操作if语句体中

   local DATA = {
      Storage = {
          Person_id = {
              Money = 0,
              Inventory = {
                  Item1 = 5
              }
          }
      }
  }

  local function ChangeData(ID, KeyTable, Value, Operation)
      local StorageValue = DATA.Storage[ID]
      local LastKey = table.remove(KeyTable)

      for i, Key in ipairs(KeyTable) do
          StorageValue = StorageValue[Key]
      end

      if Operation == "+" then
          StorageValue[LastKey] = StorageValue[LastKey] + Value
      elseif Operation == "=" then
          StorageValue[LastKey] = Value
      end
  end

  ChangeData("Person_id", {"Money"}, 5, "=")
  ChangeData("Person_id", {"Inventory", "Item1"}, 5, "+")

  print(DATA.Storage.Person_id.Money)
  print(DATA.Storage.Person_id.Inventory.Item1)

此外,如Egor Skriptunoff在评论中所述,确保将
next,KeyTable
更改为
ipairs(KeyTable)
以确保您的密钥顺序得到保留。

i,key in next,KeyTable do的
中的密钥顺序非常重要,因此使用
/
next
是有风险的。@EgorSkriptunoff哦,你说得对,我在OP的代码中遗漏了这一点,我将其更改为
ipairs
。谢谢