icreator Posted May 22, 2011 Share Posted May 22, 2011 встретилась с такой ситуацией, что удаление из таблицы, содержащей только 0-й элемент выдает результатом ПУСТО: Code: CurrMail = table.remove(MailsToProc) or MailsToProc [0] пришлось это обойти так это ошибка АПИ разрабов или так и должен работать NEXT ? Quote Link to comment Share on other sites More sharing options...
SLA Posted May 22, 2011 Share Posted May 22, 2011 Нет, тут дело самой 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 ) Quote Link to comment Share on other sites More sharing options...
Nikon Posted May 22, 2011 Share Posted May 22, 2011 Quote: так и должен работать NEXT ? А это чего такое? Quote Link to comment Share on other sites More sharing options...
SLA Posted May 22, 2011 Share Posted May 22, 2011 http://www.lua.ru/doc/5.1.html#pdf-next http://pgl.yoyo.org/luai/i/lua_next Она использует table.remove() в параметрах for, вместо ipairs(). Quote Link to comment Share on other sites More sharing options...
Nikon Posted May 22, 2011 Share Posted May 22, 2011 Ну в общем понятно Quote Link to comment Share on other sites More sharing options...
icreator Posted August 25, 2011 Author Share Posted August 25, 2011 во, гениально кстати в последних АПИ от 0-го индекса уходят Quote Link to comment Share on other sites More sharing options...
icreator Posted August 27, 2011 Author Share Posted August 27, 2011 а если я явно пишу: Code: local NAMES = { -- имена панелей на складе [1] = "Main", [2] = "Extended 1", [3] = "Extended 2", [4] = "Проба 1", [5] = "Проба 2", } то это будет быстрый массив или навороченный? Quote Link to comment Share on other sites More sharing options...
Guest Carnifex Posted August 27, 2011 Share Posted August 27, 2011 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"} Quote Link to comment Share on other sites More sharing options...
ramirez Posted August 31, 2011 Share Posted August 31, 2011 http://www.jucs.org/jucs_11_7/the_implementation_of_lua/jucs_11_7_1159_1176_defigueiredo.html 4 Tables Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.