Как передать таблицу в функцию без первого элемента? - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь создать функцию, которая получает таблицу строк и анализирует таблицу с другой функцией на основе ее первого элемента.

Мой код:

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 голосов
/ 19 сентября 2018

Функция 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) вернут

0 голосов
/ 19 сентября 2018

Возвращаемое значение из 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 = "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 )
...