什么是table.move,什么时候会用到它?

参考手册中介绍了在Lua 5.3中引入的table.move函数:

table.move (a1, f, e, t [,a2])

将表a1中的元素移动到表a2,执行以下多次赋值的等效操作:a2[t],···=a1[f],···,a1[e]。默认值为a2a1。目标范围可以与源范围重叠。要移动的元素数量必须适合Lua整数。

这段描述仍有许多需要解释的地方。我希望有一种更详细的解释来了解此函数的一般性、规范性解释(奇怪的是,我在网上找不到这样的解释,也许是因为这个函数是相当新的)。在几次阅读参考手册的解释之后,我仍然困惑以下问题:

  • 当它说“移动”时,这意味着项目正在从其原始位置移除,是吗?上面的项目指数是否向下移动以填充间隙?如果是,在同一表中进行移动,是否t指向开始移动之前的原始位置?
  • 选择索引字母fet是否有某些特殊含义?
  • 我不知道其他任何语言中是否有类似的函数。我可以使用它的示例是什么?由于它是仅有的七个表函数之一,所以我认为它非常有用。
点赞
用户2858170
用户2858170

将元素从表a1移动到表a2,执行相当于以下多重赋值a2[t],··· = a1[f],···,a1[e]

也许他们可以添加这是使用从f到e的连续整数值完成的信息。

如果您更了解Lua,您将知道Lua表没有顺序。因此,使该代码起作用的唯一方法是使用连续的整数键。特别是文档提到源范围。

给出等效语法是描述函数的最明确的方法。 如果您了解Lua的多重赋值的基本概念(参见3.3.3. Assignment), 您就知道此函数的作用。

table.move(a1, 1, 4, 6, a2) 将把a1[1]a1[2]a1[3]a1[4]复制到a2[6]a2[7]a2[8]a2[9]

最常见的用例可能是获取列表的子集。

local values = {1,45,1,44,123,2354,321,745,1231}

旧语法:

local subset = {}
for i = 3, 7 do
  table.insert(subset, values[i])
end

新的:

local subset = table.move(values, 5, 7, 1, {})

或者也许您快速地想要从表中删除最后3个值?

local a = {1,2,3,4,5,6,7}
table.move({}, 1,3,#a-2, a)
2020-10-26 09:50:48