Форум программистов, компьютерный форум, киберфорум
Наши страницы

Lua

Войти
Регистрация
Восстановить пароль
 
IvanJ
0 / 0 / 0
Регистрация: 20.08.2017
Сообщений: 5
#1

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

20.08.2017, 13:41. Просмотров 302. Ответов 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):

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

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

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

Обьявление локальных переменных - C++
Добрый день. В какой последовательности объявляются локальные переменные в функции? Если вызвать return раньше обьявления, будет ли...

Рекурсия и никаких локальных переменных - C++
Нужно решить задание используя рекурсию и не используя никаких for,while и т.д.И локальных переменных. Входные данные: 5 - количество...

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

8
vantfiles
24 / 24 / 11
Регистрация: 07.05.2013
Сообщений: 92
20.08.2017, 17:34 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
При выходе из функции все локальные переменные будут вычищены из памяти сразу после запуска сборщика мусора.
Ваша таблица 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
24 / 24 / 11
Регистрация: 07.05.2013
Сообщений: 92
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
24 / 24 / 11
Регистрация: 07.05.2013
Сообщений: 92
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
24 / 24 / 11
Регистрация: 07.05.2013
Сообщений: 92
24.08.2017, 21:47 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Если коротко, то видимость локальных идентификаторов, определенных внутри модуля аналогична видимости внутри блока - то есть за пределами модуля не видна.

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

.NET 4.x Область видимости локальных переменных в catch - C#
Вот упрощённый пример: public static void fA(){ reClError tResult=new reClError(true);//Своя структура ...

Время жизни локальных переменных в цикле - C++
Добрый вечер! допустим, в таком коде: int i=100; while(i>0) { int t = i+1; ... --i; }

PaintComponent() игнорирует изменения в локальных переменных класса - Java
Рисую в компоненте, наследованом от JPanel, используя Swing'овский paintComponent(), но вот понять не могу одного - он игнорирует изминения...

Вызов функции по клику и сохранение локальных переменных - JavaScript
Здравствуйте. Моя цель: написать программу, которая при вводе пользователем символов с клавиатуры выдает их символьный код. Выдача кода...


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

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

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