如何去掉第一个元素将表格传递给函数?

我尝试创建一个函数,接收一张字符串表格并根据第一个元素将表格解析给其他函数。

我的代码:

fruits = {}

function addToFruits(t)
print(#t)
end

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

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

我得到的结果:

6

我期望的结果:

2

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

点赞
用户5129715
用户5129715

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 ) -- 仅传入 {"apple", "banana"}
  end
end

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

显然这会破坏原始的表格,并且根据用途,可能需要表格的副本 - 有各种关于这方面的文章。

我更喜欢使用这样的结构...message = { type = "fruits", data = { "apple", "banana" } }

让数据与消息类型分离。

新代码看起来是这样的...

fruits = {}

function addToFruits(t)
   print(#t)
end

function parseTable(t)
  if t.type == "fruits" then
    addToFruits( t.data ) -- 仅传入 {"apple", "banana"}
  end
end
message = { type = "fruits", data = { "apple", "banana" } }
parseTable( message )
2018-09-19 06:25:56
用户5525442
用户5525442

table.remove 函数用于从数组的给定位置删除(并返回)一个元素。参考

function parseTable(t)
  if t[1] == "fruits" then
      local removed = table.remove(t, 1)
      print(removed) -- fruits
      addToFruits(t) -- 水果已被删除,传递 {"apple", "banana"}
  end
end

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

2018-09-19 07:24:12