myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 
 
Ответить в данную темуНачать новую тему

> Переобъявление переменной

Теги
Нет тегов для показа
dimajak
сообщение 5.12.2011, 21:46
Сообщение #1


Продвинутый участник
****

Группа: Пользователи
Сообщений: 157
Регистрация: 19.1.2010
Из: Волгоград
Пользователь №: 5 756
Спасибо сказали: 76 раз




Работает ли сабж?
Например, есть таблица с данными, для ее очистки использую следующий код:
Код
    tPlayers = nil
    tPlayers = {}
обязательно ли уничтожать таблицу?
Код
    tPlayers = nil
достаточно ли ее только объявить?
Код
    tPlayers = {}
Go to the top of the page
+Quote Post
Alexey
сообщение 5.12.2011, 22:03
Сообщение #2


7 квадратиков
*******

Группа: Модераторы
Сообщений: 791
Регистрация: 21.1.2009
Пользователь №: 1 895
Спасибо сказали: 291 раз




Достаточно.

PS: Для подобных вопросов есть специальная тема.
Go to the top of the page
+Quote Post
Setuper
сообщение 6.12.2011, 9:39
Сообщение #3


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1703 раза




То что мы присваиваем переменной tPlayers значение nil не означает, что мы стираем из памяти таблицу, на которую указывала эта пременная до этого. Этим действием мы только удаляем ссылку на эту таблицу, а если на таблицу никто не ссылается, то таблица в скором времени будет удалена из памяти сборщиком мусора.
Если же мы пишем tPlayers = {}, то это означает, что мы создаём новую (пустую) таблицу и присваиваем переменной tPlayers ссылку на новую таблицу, при этом опять же, если на старую таблицу никто не ссылается, то таблица в скором времени будет удалена из памяти сборщиком мусора.


Спасибо сказали:
Go to the top of the page
+Quote Post
dimajak
сообщение 8.12.2011, 2:15
Сообщение #4


Продвинутый участник
****

Группа: Пользователи
Сообщений: 157
Регистрация: 19.1.2010
Из: Волгоград
Пользователь №: 5 756
Спасибо сказали: 76 раз




Setuper, при удалении ссылки на эту таблицу кто может ссылаться на эту таблицу?
Go to the top of the page
+Quote Post
Setuper
сообщение 8.12.2011, 9:45
Сообщение #5


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1703 раза




Код
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 не приводит к копированию таблицы, оно лишь создаёт новую ссылку на уже существующую таблицу.


Спасибо сказали:
Go to the top of the page
+Quote Post

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

Collapse

> Похожие темы

  Тема Ответов Автор Просмотров Последнее сообщение
No New Posts Изменить тип переменной
1 Net_Strannik 2 831 28.10.2009, 18:42 Посл. сообщение: Wariner

 



RSS Сейчас: 20.1.2018, 21:45