【发布时间】:2013-06-17 19:39:30
【问题描述】:
我正在尝试使用 lua C api 将一个表移动到另一个表。例如,我有一个具有这种结构的表:
a[b][c][d][e] = value
我想将表 d 移动到 a[b] 下,我可以在 Lua 中完成,如下所示:
a[b][d] = a[b][c][d]
a[b][c][d] = nil
我目前的做法是在堆栈上加载 a[b][c][d] 表,所以堆栈看起来像:
Index Value
-1 d table
-2 c table
-3 b table
-4 a table
然后将 a[b] 加载到堆栈中,如下所示:
Index Value
-1 b table
-2 a table
-3 d table
-4 c table
-5 b table
-6 a table
然后将d的key放入栈中,将d的key和table b插入到table d下面,所以栈为:
Index Value
-1 d table
-2 d key
-3 b table
-4 a table
-5 c table
-6 b table
-7 a table
然后我使用 lua_settable(L, -3), 来做 b[d] = d。
这种方法适用于非表键,但不适用于表键。所以它会失败,比如:
a[b][c][{}][d] = value
a[b] = a[b][c][{}][d]
注意,我知道上面给出的 lua 会失败,因为键是一个新的 lua 表,我只是想说明一下。
我也尝试过从表中删除父项(这样做 a[b] = b, lua_setglobal(L, a))也没有任何运气。有谁知道我哪里出错了?
编辑: 关于如何将键/值推入堆栈的小代码 sn-p。这里的目标是将一个表从一个表结构移动到另一个表结构(或者正如我在代码中所说的,重新定义它)
解决方案:
问题是表有一些元表函数,它阻止了对表的更改(本质上,编写脚本的人有一个结构很重要的配置表,因此导致了这个问题。)
【问题讨论】: