Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lua
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
IvanJ
0 / 0 / 0
Регистрация: 20.08.2017
Сообщений: 5
1

О локальных переменных

20.08.2017, 13:41. Просмотров 950. Ответов 8
Метки нет (Все метки)

В функцию в качестве аргумента приходит таблица data = { 'a', 'b', 'c', 'd', 'e' }
Для удобства я делаю следующее:

local var1 = data[1]
local var2 = data[2]
local var3 = data[3]
local var4 = data[4]
local var5 = data[5]

Вопрос состоит в следующем: при выходе из этой функции, что случится с переменными var1-5 и таблицей data? Будут ли они храниться в окружении данной функции или уничтожатся? Если data будут храниться, то не будет ли расточительством делать переменные var1-5? (т.к. это по сути копии таблицы data). Просто мне удобно использовать var1-5 (т.к. легче обращаться к значениям по имени переменной, а не по индексу в в таблице data), но в то же время опасаюсь, что это будет лишним засорением памяти.


// Появилась ещё идея, после ввода переменных var1-5 выполнить код: data = nil. Что скажете?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2017, 13:41
Ответы с готовыми решениями:

Удаление переменных
Возможно ли в lua удалить все переменные , что бы они в какой то момент все...

Рассмотреть программу, написать имена глобальных переменных, локальных переменных, формальных параметров
Program P1; var s:string; procedure P(var s:string) ; var...

Неинициализация локальных переменных
Здравствуйте.Пишу в Visual studio 2012.Пишет что использованы...

Обьявление локальных переменных
Добрый день. В какой последовательности объявляются локальные переменные в...

Использование локальных переменных
Необходимо: Сначала отрицательные элементы в обратном порядке, затем нули, а в...

8
vantfiles
35 / 34 / 17
Регистрация: 07.05.2013
Сообщений: 131
20.08.2017, 17:34 2
Лучший ответ Сообщение было отмечено Catstail как решение

Решение

При выходе из функции все локальные переменные будут вычищены из памяти сразу после запуска сборщика мусора.
Ваша таблица data останется в памяти, если она объявлена глобально.

На Луа можно делать вот так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
function my_func( t )
 
  print( t.var1, t.var2, t.var3, t.var4, t.var5 )
 
end
 
my_func({
  var1 = "a",
  var2 = "b",
  var3 = "c",
  var4 = "d",
  var5 = "e"
})
0
IvanJ
0 / 0 / 0
Регистрация: 20.08.2017
Сообщений: 5
20.08.2017, 20:45  [ТС] 3
Если data не объявлена глобально, то она будет также уничтожена, как и var1-5?

И еще вопрос. Допустим, такой код:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
local var_func
 
function func()
      local var = 'abc' -- Создаем локальную переменную
   
      function func_2()
            print(var)
      end
   
      var_func = func_2 -- сохраняем во внешнюю переменную созданную функцию
   
      -- Выход из функции, локальная переменная 'var' уничтожается.
end
 
func()
 
var_func() -- по сути запускаем ранее созданную функцию func_2
 
 
-- ВЫВОД: 'abc'

Если локальные переменные уничтожаются при выходе из функции, почему тогда мы прочли локальную переменную 'var'?
0
vantfiles
35 / 34 / 17
Регистрация: 07.05.2013
Сообщений: 131
21.08.2017, 08:55 4
Ваш вопрос касается сразу двух тем - области видимости идентификаторов и времени существования объектов Луа (переменных, таблиц, функций и т.д.).
Вы модули умеете использовать? Я имею в виду функцию require... если да, я попробую на примере модулей ответить на ваши вопросы...

Добавлено через 15 минут
Да, и на всякий случай - какую версию Lua Вы используете?
0
IvanJ
0 / 0 / 0
Регистрация: 20.08.2017
Сообщений: 5
21.08.2017, 10:09  [ТС] 5
Версия - 5.1

По поводу модулей - не умею
0
vantfiles
35 / 34 / 17
Регистрация: 07.05.2013
Сообщений: 131
21.08.2017, 11:17 6
Хорошо, давайте попробуем разобраться в пределах одного модуля...

Итак. Область видимости локального идентификатора распространяется исключительно на тот блок, в котором он определен.

Пример 1:

C
1
2
3
4
5
6
7
8
9
10
11
12
local a = 123 -- переменная объявлена локальной, но (!) в пределах модуля она видна всем.
 
function example_01()
 
    local a = 456
    print( a )
 
end
 
example_01()  -- выведется 456, поскольку функция считается блоком видимости
 
print( a ) -- выведется 123, поскольку мы вне функции и область видимости теперь ограничена модулем ( тем исходником, где все это написано )
Пример 2:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
local a = 12345
 
function example_02()
 
    local a = 456
    print( a ) -- выведется 456
 
    for i = 1, 5 do
        local a = 789
        print( a ) -- в цикле 5 раз выведется 789
    end
 
    print( a ) -- выведется 456, мы вышли из области видимости цикла и вернулись к локальной переменной определенной выше этого блока
 
end
 
example_02() -- выведется 456, пять раз 789 и снова 456
 
print( a ) -- выведется 12345, мы вышли за область видимости функции
Это пока понятно или что-то требует объяснений?
0
IvanJ
0 / 0 / 0
Регистрация: 20.08.2017
Сообщений: 5
21.08.2017, 14:13  [ТС] 7
Это понятно
0
IvanJ
0 / 0 / 0
Регистрация: 20.08.2017
Сообщений: 5
24.08.2017, 21:22  [ТС] 8
что дальше?
0
vantfiles
35 / 34 / 17
Регистрация: 07.05.2013
Сообщений: 131
24.08.2017, 21:47 9
Лучший ответ Сообщение было отмечено IvanJ как решение

Решение

Если коротко, то видимость локальных идентификаторов, определенных внутри модуля аналогична видимости внутри блока - то есть за пределами модуля не видна.

Что касается времени жизни данных, на которые ссылается идентификатор - то оно определяется очень просто - данные не могут быть уничтожены из памяти до тех пор, пока на них ссылается хотя бы один глобальный идентификатор.
0
24.08.2017, 21:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2017, 21:47

Вопрос по компиляции локальных переменных
В общем, я разобрался с компиляцией выражений и глобальных переменных, теперь...

Рекурсия и никаких локальных переменных
Нужно решить задание используя рекурсию и не используя никаких for,while и...

Область видимости локальных переменных в catch
Вот упрощённый пример: public static void fA(){ reClError tResult=new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru