Переобъявление переменной |
Здравствуйте, гость ( Вход | Регистрация )
Переобъявление переменной |
5.12.2011, 21:46
Сообщение
#1
|
|
Продвинутый участник Группа: Пользователи Сообщений: 157 Регистрация: 19.1.2010 Из: Волгоград Пользователь №: 5 756 Спасибо сказали: 77 раз |
Работает ли сабж?
Например, есть таблица с данными, для ее очистки использую следующий код: Код tPlayers = nil обязательно ли уничтожать таблицу?tPlayers = {} Код tPlayers = nil достаточно ли ее только объявить?Код tPlayers = {}
|
|
|
5.12.2011, 22:03
Сообщение
#2
|
|
7 квадратиков Группа: Модераторы Сообщений: 793 Регистрация: 21.1.2009 Пользователь №: 1 895 Спасибо сказали: 301 раз |
|
|
|
6.12.2011, 9:39
Сообщение
#3
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
То что мы присваиваем переменной tPlayers значение nil не означает, что мы стираем из памяти таблицу, на которую указывала эта пременная до этого. Этим действием мы только удаляем ссылку на эту таблицу, а если на таблицу никто не ссылается, то таблица в скором времени будет удалена из памяти сборщиком мусора.
Если же мы пишем tPlayers = {}, то это означает, что мы создаём новую (пустую) таблицу и присваиваем переменной tPlayers ссылку на новую таблицу, при этом опять же, если на старую таблицу никто не ссылается, то таблица в скором времени будет удалена из памяти сборщиком мусора. |
|
|
8.12.2011, 2:15
Сообщение
#4
|
|
Продвинутый участник Группа: Пользователи Сообщений: 157 Регистрация: 19.1.2010 Из: Волгоград Пользователь №: 5 756 Спасибо сказали: 77 раз |
Setuper, при удалении ссылки на эту таблицу кто может ссылаться на эту таблицу?
|
|
|
8.12.2011, 9:45
Сообщение
#5
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Код local a = {} local b = a a = nil Создаётся таблица, и записывается в переменную "a" ссылка на эту таблицу. В переменную "b" копируется ссылка на эту же самую таблицу (НЕ КОПИРУЕТСЯ сама таблица!). Далее уничтожается ссылка переменной "a" на эту таблицу. Однако на таблицу остаётся ссылка переменной "b", поэтому таблица не будет уничтожена сборщиком мусора. Пример, показывающий, что мы действительно имеем дело с одной таблице и двумя ссылками на эту таблицу (то есть под таблицу память выделена 1 раз): Код local a = {v = 5} local b = a print(a.v) -- напечатает "5" print(b.v) -- напечатает "5" b.v = 6 print(a.v) -- напечатает "6" print(b.v) -- напечатает "6" a.v = 7 print(a.v) -- напечатает "7" print(b.v) -- напечатает "7" То есть, в данном примере переменные "a" и "b" равнозначны, так как ссылаются на одну и ту же таблицу (на одну и ту же память), и для изменения данных по этой памяти мы можем использовать как переменную "a", так и переменную "b". Другими словами: действие b = a не приводит к копированию таблицы, оно лишь создаёт новую ссылку на уже существующую таблицу. |
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последнее сообщение | |
---|---|---|---|---|---|
Изменить тип переменной | 1 | Net_Strannik | 5 728 | 28.10.2009, 18:42 Посл. сообщение: Wariner |
|
Сейчас: 23.11.2024, 0:15 |