从C中的Lua表中删除所有项

从C中的Lua表中删除所有项,lua,Lua,是否可以在C中快速删除Lua表中的所有项,而不单独手动删除所有项 我知道,我可以在卢阿做到这一点,只要说 t = {} 但我特别想在C中找到一种解决方案,它可以从堆栈中的某个表中删除所有项 为了不熟悉的人而改变一种语言的习惯用语往往是不合适的 如果您想明确一个与t={}相同的操作,可以使用 清空一个表和t={}不是一回事 举例说明: local tab1 = {1,2,3,4,5} local tab2 = tab1 function clear(t) for k in pairs

是否可以在C中快速删除Lua表中的所有项,而不单独手动删除所有项

我知道,我可以在卢阿做到这一点,只要说

t = {}

但我特别想在C中找到一种解决方案,它可以从堆栈中的某个表中删除所有项

为了不熟悉的人而改变一种语言的习惯用语往往是不合适的

如果您想明确一个与
t={}
相同的操作,可以使用

清空一个表和
t={}
不是一回事

举例说明:

local tab1 = {1,2,3,4,5}

local tab2 = tab1

function clear(t)
    for k in pairs(t) do
        t[k] = nil
    end
end

clear(tab2)

for k, v in pairs(tab1) do
    print(k, v)
end
这导致
选项卡1中没有值。这是因为
tab1
tab2
引用同一个表,因此对
tab2
所做的更改反映在
tab1

local tab1 = {1,2,3,4,5}

local tab2 = tab1

tab2 = {}

for k, v in pairs(tab1) do
    print(k, v)
end
我们到了

11

2.2

3 3

4.4

5.5

这是因为
tab2
指向了另一个表,并且没有改变它以前引用的表

如果您想在c api中执行第一个示例,可以这样做:

/*名称:清除
*功能(t)*/
静态int lcf1_清除(lua_状态*L){
枚举{lc_nformalargs=1};
lua_机顶盒(L,1);
/*对于成对的k(t)do
*内部:局部f,s,var=explist*/
枚举{lc1=1};
lua_getfield(L,lua_环境索引,pairs);
lua_值(L,1);
lua_调用(L,1,3);
而(1){
/*内部:局部变量1,…,变量n=f(s,变量)
*如果var_1==nil,则中断结束
*var=var_1*/
lua_值(L,-3);
lua_值(L,-3);
lua_值(L,-3);
lua_调用(L,2,1);
if(lua_isnil(L,-1)){
打破
}
lua_值(L,-1);
lua_替换(L,-3);
/*内部:带idx 5的本地k*/
/*t[k]=nil*/
卢阿努普什尼勒(L);
lua_值(L,5);
lua_插入物(L,-2);
lua_可设置(L,1);
断言(lua_gettop(L)==5);
/*内部:范围退出时的堆栈清理*/
卢厄波普(L,1);
}
lua_机顶盒(L,lc1);
断言(lua_gettop(L)==1);
返回0;
}
这是使用Lua5.1生成的,它可能需要一些改进,但要了解如何在其工作的c api中执行某些操作,它可能是一个有助于理解的工具


我再次强调,我强烈建议您不要更改这样的习惯用法。

t={}
不会删除
t
中的所有项:它将
t
中的表替换为一个新的空表。在C中也可以这样做。是的,我知道,但我特别想在C中删除现有表中的所有元素,而不逐个删除它们。CWA中没有用于删除Lua表中所有项目的API。你为什么要这样做?你能提供更多关于如何使用此表格清理的详细信息吗?@Nifim:TLDR:纯粹的学术好奇心。长版本:我试图向Lua的表库添加一个新函数:
table.clear()
。我知道这不是真的必要,因为我可以用@lhf解释过的空表替换表,但我认为
table.clear()
会更好,因为它对于不熟悉Lua的人来说更可读。