Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 使用非整数键删除表_Lua - Fatal编程技术网

Lua 使用非整数键删除表

Lua 使用非整数键删除表,lua,Lua,我想让我的removeIf(aTable,unarydpredicate)函数删除满足谓词的元素 我凭直觉编写了以下代码,对我来说,它居然能工作: for k, v in pairs(aTable) do if unaryPredicate(v) then atable[k] = nil end end next或pairs背后的魔力是什么。据我所知,它会精确地迭代sizeof(aTable)次。next只取决于表中的键。循环移除值,但不移除键(在当前的Lua实

我想让我的
removeIf(aTable,unarydpredicate)
函数删除满足谓词的元素

我凭直觉编写了以下代码,对我来说,它居然能工作:

for k, v in pairs(aTable) do
    if unaryPredicate(v) then
        atable[k] = nil
    end
end

next
pairs
背后的魔力是什么。据我所知,它会精确地迭代sizeof(aTable)次。

next
只取决于表中的键。循环移除值,但不移除键(在当前的Lua实现中)。文档明确指出,您可以在类似您的循环中从表中删除值。它还指出,不能使用新键添加新条目,因为这会混淆
next

next
仅取决于表中的键。循环移除值,但不移除键(在当前的Lua实现中)。文档明确指出,您可以在类似您的循环中从表中删除值。它还指出,不能使用新键添加新条目,因为这会混淆
next

Lua表本质上是作为哈希表实现的。哈希表存储
(键、值)
对的数组

使用散列快速跳到它们的键应该在表中的位置

但是,请注意,在
next
的实现中有一个
nil
检查:

if (!ttisnil(&t->array[i])) {  /* a non-nil value? */
这是因为当
nil
被分配给表的键时,它会更新哈希表中的(键,值)对,但实际上不会删除该项。因此,在哈希表中留下一个(key,
nil
)条目。这种设计允许通过
next
进行迭代,在为现有键分配值时(包括分配给
nil
时)不受影响地继续进行


然而,这是一个实现细节。哈希表中是否有
nil
条目在表实现公开的API中是完全不可见的。每个函数在外部处理这些
nil
键的方式与处理缺席键的方式完全相同。

Lua表本质上是作为哈希表实现的。哈希表存储
(键、值)
对的数组

使用散列快速跳到它们的键应该在表中的位置

但是,请注意,在
next
的实现中有一个
nil
检查:

if (!ttisnil(&t->array[i])) {  /* a non-nil value? */
这是因为当
nil
被分配给表的键时,它会更新哈希表中的(键,值)对,但实际上不会删除该项。因此,在哈希表中留下一个(key,
nil
)条目。这种设计允许通过
next
进行迭代,在为现有键分配值时(包括分配给
nil
时)不受影响地继续进行


然而,这是一个实现细节。哈希表中是否有
nil
条目在表实现公开的API中是完全不可见的。每个函数外部处理这些
nil
键的方式与不存在键完全相同。

代码中没有
next
。而且,
计数器
没有明显的作用。计数器错误地存在。next是由pairs返回的?我猜pairs是表的深层副本,因此next知道如何在迭代过程中删除元素的情况下对表进行迭代。
pairs
不复制任何内容。我不知道它在仅保留引用的情况下应该如何工作。但是,正如我所说,这只是一个猜测。代码中没有
next
。而且,
计数器
没有明显的作用。计数器错误地存在。next是由pairs返回的?我猜pairs是表的深层副本,因此next知道如何在迭代过程中删除元素的情况下对表进行迭代。
pairs
不复制任何内容。我不知道它在仅保留引用的情况下应该如何工作。但是,正如我所说,这只是一个猜测。我在将值设置为nil后记录表。此时不存在属于该值的键。这似乎与LuaUsersWiki上的帖子一致:“lua表不区分表值为nil和表中不存在的对应键。”我在将值设置为nil后记录表。此时不存在属于该值的键。这似乎与lua users wiki上的帖子一致:“lua表不区分表值为零和表中不存在的对应键。”感谢您的回答!这澄清了很多。你会说利用这个实现来创建removeIf是一种糟糕的做法吗?Lua明确保证修改现有键不会影响迭代顺序:谢谢你的回答!这澄清了很多。你会说利用这个实现来创建removeIf是不好的做法吗?Lua明确保证修改现有键不会影响迭代顺序: