2015-04-06 1 views
0
for i = 1, #allblocks do  to remove all objects in the table 
Removing_block = table.remove(allblocks, 1) 
Removing_block:removeSelf() 
Removing_block=nil 
end 

Это лучший способ найти работу. У кого-то есть лучший способ?лучший способ удалить все объекты в таблице

+1

Запуск этого цикла в обратном направлении будет лучше, так как он не требует повторной индексации таблицы каждый раз через петлю. –

+0

спасибо, но я не могу этого сделать. объект постоянно добавляется –

+1

Я не понимаю. У вас есть код **, добавляющий ** элементы в эту таблицу одновременно с запуском этого цикла для их удаления? Как? Добавление после завершения цикла не имеет значения. –

ответ

2

Выработать на комментарий Этан в:

Изменить код:

for i = #allblocks, 1, -1 do 
    Removing_block = table.remove(allblocks, i) 
    Removing_block:removeSelf() 
    Removing_block = nil 
end 

Я предполагаю, что по той или иной причине вы не можете сделать

allblocks = {} 

сбросить его ? По сути, вы делаете то же самое, кажется.

+1

Каждый раз каждый раз вычисляет размер таблицы. Это не нужно. Инвертируйте биты в цикле 'for': 'для i = #allblocks, 1 do' и просто использовать' i' в вызове 'table.remove'. И' allblocks = {} 'не вызывает' removeSelf' для каждого объекта, который, возможно, вероятно, является важной деталью –

+0

Довольно верно. И спасибо, что указали это, с инвертированием. Я изначально думал об этом, отвлекался, писал что-то еще, и небрежно чтобы вспомнить мою оригинальную мысль. Престижность вам, поскольку это была ваша идея в первую очередь. :) – Josh

+1

Не забывайте -1 при спуске :) – tonypdmtr

3

Это самый простой способ:

for i = 1, #allblocks do 
    allblocks[i]:removeSelf() 
    allblocks[i] = nil 
end 
1

Предположения: таблица список индексированных 1..n

Учитывая, что table.remove() также возвращает только что удалили элемент, самый простой (кратчайшее) возможно, это так:

for i = 1, #allblocks do 
    table.remove(allblocks):removeSelf() 
end