table.remove

时间:2016-06-22 05:50:33

标签: lua lua-table

table.remove的{​​p> The reference manual说:

  

table.remove (list [, pos])

     

从位置list的{​​{1}}元素中删除,返回已删除元素的值。当pospos1之间的整数时,它会向下移动元素#listlist[pos+1],...,list[pos+2]并删除元素list[#list];当list[#list]pos0时,索引#list也可以是0;在这些情况下,该函数会删除元素#list + 1

list[pos] pos0感兴趣的最后两个特殊情况。

#list + 1 pos的示例代码:

0

在这种情况下,元素local t1 = {[0] = 'foo'} table.remove(t1, 0) 将被删除。

t1[0] pos的示例代码:

#list + 1

在这种情况下,除了语句不会引发错误外,没有任何改变。

我的理解是否正确?这两个特殊情况何时在实践中有用?

我还注意到自Lua 5.2以来增加了两个案例

2 个答案:

答案 0 :(得分:0)

表通过匹配键和值来工作。默认情况下,键从1开始并转到#list。所有未定义的键的值都为nil。

{{1}}

所以你的代码只是在#t + 1

中返回nil

在实践中,通常以1开始表。但是在某些应用程序中,例如图形,从0开始可能更有意义。

答案 1 :(得分:0)

最后两个特殊情况有助于在 5.2版本中设置和定义边界。 table.remove还有其他与此相关的更改。看看吧!

-- Lua 5.1 version
t = {'foo', 'bar' , 'baz'}

local v = table.remove(t, 1)
print(v) 
>>nil
table.remove(t, 7)
-- no crash or error message
-- Lua 5.2 version
t = {'foo', 'bar' , 'baz'}

local v = table.remove(t, 1)
print(v) 
>>foo
table.remove(t, 7)
>>stdin:1 bad argument #1 to 'remove' (position out of bounds)

当用户在 5.2 中调用table.remove时,该值将从 表中删除并返回 。在 5.1 中,仅删除该值。  此外,在 5.2版本中,当用户尝试从超出边界的位置移除元素时,会生成错误消息。

这与特殊情况有什么关系?如果他们没有包括

,那就好了
  

pos0

时,索引#list也可以是0

参数,然后在空表上使用table.remove(t)时会崩溃。请记住,表是异构的,在很多情况下,它们同时用作数组和哈希映射!有时希望在保留哈希映射的同时去除阵列部分。为此,

while table.remove(t) do end  -- ends when the t runs out of elements at t[0]  

但有一点需要注意!如果#list > 0使用table.remove(list, 0)时会崩溃! #list必须等于0

-- Lua 5.2 version
t = {'foo', 'bar' , 'baz'}

table.remove(t, 0) -- #t is 3
>>stdin:1 bad argument #1 to 'remove' (position out of bounds)
table.remove(t)    -- baz
table.remove(t)    -- bar
table.remove(t)    -- foo
-- #t is now 0
table.remove(t, 0) -- nil
-- nothing happens

最后一个特例#list + 1只是为了在修剪列表时使语法更清晰。 for循环来擦除元素pos

-- 7 is just a random number I picked
while table.remove(t, 7) do end  -- this will end when the t[7] = nil (aka #t + 1)   

希望这有用!