当嵌套表并尝试table.remove时出现“table expected, got string”错误

我目前正在尝试创建一个包含表的表,并从先前的嵌套表中删除部分来创建下一个嵌套表,从而使每个嵌套表的长度减少1。

但是,在运行下面的代码时,它会触发一个“bad argument #1 to 'remove' (got string, expected table)”错误。我不明白为什么会出现这种情况。

possiblePorts = {}
possiblePorts[1] = {"VGA","USB","Ethernet","9mm","HDMI"}
for i=2,5 do
  possiblePorts[i] = table.remove(possiblePorts[i-1],math.random(1,5))
end

我期望它创建一个表格:

possiblePorts = {
  {"VGA","USB","Ethernet","9mm","HDMI"},
  {"VGA","Ethernet","9mm","HDMI"},
  {"VGA","9mm","HDMI"},
  {"9mm","HDMI"},
  {"9mm"}
} --简单查看格式化

或类似的东西 - 为什么不这样做,我该怎么办?

点赞
用户7396148
用户7396148

table.remove 将返回被移除的元素而不是表中剩余的元素。

Lua 5.3 参考手册 #table.remove

在你的代码中,第一个循环没有问题。在第二个循环中,possiblePorts[i-1] 现在是 2,所以我们试图在索引为 2 的值上使用 table.remove。在第一个循环中放置在索引为 2 的值是一个字符串,所以我们尝试将其作为 table.remove 的第一个参数传递而生成错误。

你也不能在每个表上都使用 math.random(1,5),因为这会导致你的索引超出了数组的末尾,这将导致 table.remove 错误。你要将 5 换成数组的长度。

这段代码完成了你想要实现的功能

local possiblePorts = {}
possiblePorts[1] = {"VGA","USB","Ethernet","9mm","HDMI"}
for i=2,5 do
  possiblePorts[i] = {}
  local skip = math.random(1,#possiblePorts[i-1]) -- 随机获取要跳过的值
  local index = 0                                 -- 为新数组的索引

  for j=1,#possiblePorts[i-1] do   -- 循环所有上一个数组中的元素。
    if j ~= skip then              -- 如果值不是我们要跳过的,添加它。
      index = index + 1
      possiblePorts[i][index] = possiblePorts[i-1][j]
    end
  end
end

for k,v in ipairs(possiblePorts) do
  print(k, "{" .. table.concat(v," ") .. "}")
end

输出:

1   {VGA USB Ethernet 9mm HDMI}
2   {USB Ethernet 9mm HDMI}
3   {USB Ethernet HDMI}
4   {Ethernet HDMI}
5   {Ethernet}
2019-09-17 14:19:16