How to remove a lua table entry by its key?
我有一个lua表,用作哈希图,即带有字符串键:
1
| local map = { foo = 1, bar = 2 } |
我想"弹出"该表的键所标识的元素。 有一个table.remove()方法,但是它只使用要删除的元素的索引(即数字),而不是通用键。 我希望能够做到table.remove(map, 'foo'),这是我实现它的方式:
1 2 3 4 5
| function table.removekey(table, key)
local element = table[key]
table[key] = nil
return element
end |
有更好的方法吗?
-
+1非常有用的问题,因为您给出了我需要的"答案"; 即使没有"更好"的方式。
不可以,将键的值设置为nil是删除表的哈希映射部分中的项的公认方法。 您正在做的是标准的。 但是,我建议不要覆盖table.remove()-对于表的数组部分,默认的table.remove()功能包括对索引重新编号,而覆盖不会这样做。 如果您确实想将函数添加到table函数集中,那么我可能会使用类似table.removekey()之类的名称。
-
感谢您提供有关删除的反馈。关于函数的名称,这主要是为了阐明我的观点。我通常不重写标准功能。我绝对不会以该名称使用它(table.removekey()也是我的最佳选择)。
-
如果您仅在单个块中使用它,则只需将其设置为局部函数即可(在每个调用中节省全局查找的开销),从而在性能上更好。如果我经常使用table.insert和table.remove之类的东西,我经常将table.insert和table.remove导入本地名称空间。
-
感谢您提供的性能提示。我会尝试将我经常使用的函数导入本地名称空间,以查看这是否有很大的不同。
-
请注意,您应该使用table.remove(indez,position)而不是将其设置为nil,这样索引将减少,因此元素将重新放置。
-
@HakanBoztepe这与表的hashmap部分(字符串键)无关。
-
@Amber:数组部分是一个实现细节,即使键不在数组部分中,table.remove可能也必须(实际上)进行重新编号。您需要的是序列部分,它实际上是定义明确的,并且与实现细节无关。序列部分可以远大于数组部分,反之亦然。