table.remove
的{p> The reference manual说:
table.remove (list [, pos])
从位置
list
的{{1}}元素中删除,返回已删除元素的值。当pos
是pos
和1
之间的整数时,它会向下移动元素#list
,list[pos+1]
,...,list[pos+2]
并删除元素list[#list]
;当list[#list]
为pos
或0
时,索引#list
也可以是0
;在这些情况下,该函数会删除元素#list + 1
。
list[pos]
pos
或0
感兴趣的最后两个特殊情况。
#list + 1
pos
的示例代码:
0
在这种情况下,元素local t1 = {[0] = 'foo'}
table.remove(t1, 0)
将被删除。
t1[0]
pos
的示例代码:
#list + 1
在这种情况下,除了语句不会引发错误外,没有任何改变。
我的理解是否正确?这两个特殊情况何时在实践中有用?
我还注意到自Lua 5.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版本中,当用户尝试从超出边界的位置移除元素时,会生成错误消息。
这与特殊情况有什么关系?如果他们没有包括
,那就好了当
时,索引pos
为0
#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
只是为了在修剪列表时使语法更清晰。
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)
希望这有用!