Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

table.remove( [0]


icreator

Рекомендуемые сообщения

встретилась с такой ситуацией, что удаление из таблицы, содержащей только 0-й элемент выдает результатом ПУСТО:

Code:
CurrMail = table.remove(MailsToProc) or MailsToProc [0] 

пришлось это обойти так

это ошибка АПИ разрабов или так и должен работать NEXT ?

Ссылка на комментарий
Поделиться на другие сайты

Нет, тут дело самой Lua. В Lua, существуют два вида таблиц:

1) "Быстрые" таблицы, наподобие массивов в Си, только индексируются числами, с 1 (а не с 0, как в Си). Именно для обслуживания таких таблиц, существуют table.insert() и table.remove(). Чтобы таблица оставалась массивом (а не была "на лету" сконвертирована в "навороченную" таблицу), добавлять и убирать элементы в неё нужно ТОЛЬКО этими двумя функциями.

2) "Навороченные" таблицы (как в PHP), в которых индексом может служить что угодно (числа, строки, и др.). В них, элементы добавляются так: Таблица[ Индекс ] = Что-то, а убираются так: Таблица[ Индекс ] = nil.

table.insert() и table.remove() предназначены для работы с массиво-подобными таблицами. И не будь у Lua податливый женский характер, или будь она стервозна, она могла бы напрочь отказаться обрабатывать этими функциями "навороченные" таблицы. Однако, то, что эти две функции работают с такими таблицами - это, как бы, бонус. Например, в Lua, никто не мешает нам сделать вот такую таблицу:

local a = { [-1] = 10, [0] = 20, [1] = 30, [1.5] = 40, [2] = 50, [3] = 60 }

Чудо, но table.remove() будет с ней работать, и удалит индексы 3, 2, 1, однако, индексы -1, 0, 1.5 не тронет... А вот с такой таблицей, table.remove() работать откажется сразу:

local a = { [-1] = 10, [0] = 20, [1] = 30, [1.5] = 40, [3] = 60 }

Так как я удалил индекс 2, и Lua видит, что в цепочке целочисленных индексов (1 - 3) появилась дыра, и уже совершенно очевидно, что это не массиво-подобная таблица.

Таблицы, индексируемые с нуля, это "изобретение" разработчиков АО, не знаю, зачем они так сделали. По стандартам Lua, таблицы должны индексироваться с 1. Однако, любую таблицу, получаемую из API, индексированную с нуля, можно "вылечить" такой простой командой:

Code:
table.insert( МояТаблица, 0, nil )
Ссылка на комментарий
Поделиться на другие сайты

http://www.lua.ru/doc/5.1.html#pdf-next

http://pgl.yoyo.org/luai/i/lua_next

Она использует table.remove() в параметрах for, вместо ipairs().

Ссылка на комментарий
Поделиться на другие сайты

  • 3 месяца спустя...

во, гениально

кстати в последних АПИ от 0-го индекса уходят

Ссылка на комментарий
Поделиться на другие сайты

а если я явно пишу:

Code:
local NAMES = { -- имена панелей на складе

 [1]  = "Main",

 [2]  = "Extended 1",

 [3]  = "Extended 2",

 [4]  = "Проба 1",

 [5]  = "Проба 2",

  }

то это будет быстрый массив или навороченный?

Ссылка на комментарий
Поделиться на другие сайты

don't know, if this will be optimized to the fast array-version, but why you do not use this:

local Names={"Main","Extended 1",Extended 2"}

Ссылка на комментарий
Поделиться на другие сайты

Ссылка на комментарий
Поделиться на другие сайты

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...

Важная информация

Пользуясь сайтом, вы принимаете Условия использования