Jump to content
Alloder.pro: about Allods with love
Search In
  • More options...
Find results that contain...
Find results in...

New program for writers

We turn from quantity to quality and tell you how we will supplement the Allods Team program with rewards in rubles.


The new Updater

Let us to introduce the new addon updater software and to share the details

Read more

Alloder 2.0

We have started the process of project evolve, and this relates not only, and not even primarily of the site's view

Read more

table.remove( [0]


Recommended Posts

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

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

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

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

Link to comment
Share on other sites

Нет, тут дело самой 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, индексированную с нуля, можно "вылечить" такой простой командой:

table.insert( МояТаблица, 0, nil )
Link to comment
Share on other sites

  • 3 months later...

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

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

 [1]  = "Main",

 [2]  = "Extended 1",

 [3]  = "Extended 2",

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

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


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

Link to comment
Share on other sites

Guest Carnifex

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"}

Link to comment
Share on other sites

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.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Create New...

Important Information

By using our site you agree to the Terms of Use