如何将表格传递给函数但不包括第一个元素?

3
我是一个能翻译文本的有用助手。下面是需要翻译的内容:

我正在尝试创建一个函数,该函数接收一个字符串表并将该表解析到另一个函数中,该函数基于其第一个元素。

我的代码:

fruits = {}

function addToFruits(t)
print(#t)
end

function parseTable(t)
  if t[1] == "fruits" then
    addToFruits(table.remove(t, 1)) --pass only {"apple", "banana"}
  end
end

parseTable({"fruits", "apple", "banana"})

我得到的结果:

6

我期望的结果:

2

如何正确解析不包括第一个元素的表格?

2个回答

4
table.remove 的返回值是被移除的元素("fruits")。
该对象是一个字符串,长度为6,这解释了你的代码得到的答案。
如果你想要正确的答案2,那么以下代码将实现。
fruits = {}

function addToFruits(t)
  print(#t)
end

function parseTable(t)
  if t[1] == "fruits" then
    table.remove(t, 1)
    addToFruits( t ) --pass only {"apple", "banana"}
  end
end

parseTable({"fruits", "apple", "banana"})

显然,这会破坏原始表格,并且根据使用情况,需要进行表格复制 - 有各种文章可以参考。

我更倾向于使用以下结构...

message = { type = "水果", data = { "苹果", "香蕉" } }

允许数据与消息类型分离。

新代码将如下所示....

fruits = {}

function addToFruits(t)
   print(#t)
end

function parseTable(t)
  if t.type == "fruits" then
    addToFruits( t.data ) --pass only {"apple", "banana"}
  end
end
message = { type = "fruits", data = { "apple", "banana" } }
parseTable( message )

3
参考
remove函数会从数组中删除(并返回)指定位置的一个元素。
function parseTable(t)
  if t[1] == "fruits" then
      local removed = table.remove(t, 1)
      print(removed) -- fruits
      addToFruits(t) -- fruits removed and will pass {"apple", "banana"}
  end
end

答案 6 是 “fruits” 的长度,table.remove(t, 1) 将返回该值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接