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

Мой код .

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

Как правильно разобрать таблицу без первого элемента?

3
Zack Lee 19 Сен 2018 в 09:11

2 ответа

Лучший ответ

Возвращаемое значение из 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 )
4
mksteve 19 Сен 2018 в 06:35

Функция table.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 была длина "фруктов", которые вернет table.remove(t, 1).

3
wsha 19 Сен 2018 в 07:24