如何在没有第一个元素的情况下将表传递给函数?

时间:2018-09-19 06:11:00

标签: lua lua-table

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

我的代码:

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 个答案:

答案 0 :(得分:4)

table.remove的返回值是已删除的元素(“水果”)

该对象是一个字符串,长度为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 = "fruits", data = { "apple", "banana" } }

允许将数据与消息类型分开。

新代码看起来像....

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 )

答案 1 :(得分:3)

table.remove函数从数组中的给定位置删除(并返回)元素。 ref

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是table.remove(t, 1)将返回的“水果”的长度