【问题标题】:What exactly does table.move do, and when would I use it?table.move 到底是做什么的,我什么时候使用它?
【发布时间】:2020-10-26 21:47:17
【问题描述】:

reference manual 对 Lua 5.3 中引入的 table.move 函数有这样的说法:

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

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

这个描述还有很多不足之处。我希望得到一个比参考手册更详细的功能的一般、规范解释。 (奇怪的是,我在网上的任何地方都找不到这样的解释,也许是因为这个功能相当新。)

在阅读参考手册的解释几次后我仍然感到困惑:

  • 当它说“移动”时,这意味着项目正在从其原始位置移走,对吗?被移除项目上方的项目索引是否向下移动以填补空白?如果是这样,并且我们在同一张桌子内移动,t 是否会在任何东西开始移动之前指向原始位置?
  • 索引字母fet的选择有什么意义吗?
  • 在我所知道的任何其他语言中都没有类似的功能。我可以如何使用它的一个例子是什么?由于它是仅有的七个表函数之一,我认为它非常有用。

【问题讨论】:

  • a2[t],··· = a1[f],···,a1[e] 是一个非常清晰的描述。换句话说,正在复制一系列连续的数组索引。 “移动”这个词可能具有误导性。但是,当您在同一个表中将 100 个元素从 3..102 复制到 4..103 时,它们是被移动而不是被复制。未修改索引 3 处的元素。
  • 我的猜测:f fromeendtto 是表索引。

标签: lua


【解决方案1】:

将元素从表 a1 移动到表 a2,相当于下面的多重赋值 a2[t],··· = a1[f],···,a1[e] 也许他们可以添加使用从fe 的连续整数值完成的信息。

如果你对 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2011-08-18
    • 2017-03-21
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多