<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Локальные переменные]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Локальные переменные форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sun, 03 May 2026 13:13:59 +0300</pubDate>
		<item>
			<title>Локальные переменные</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message26343/topic3018/">Локальные переменные</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_6wCZbIj6" href="/user/6717/" bx-tooltip-user-id="6717">Иван Джеммер</a> написал:<br />В функцию в качестве аргумента приходит таблица data = { 'a', 'b', 'c', 'd', 'e' }<br />Для удобства я делаю следующее:<br /><br />local var1 = data&#91;1&#93;<br />local var2 = data&#91;2&#93;<br />local var3 = data&#91;3&#93;<br />local var4 = data&#91;4&#93;<br />local var5 = data&#91;5&#93;<br /><br />Вопрос состоит в следующем: при выходе из этой функции, что случится с переменными &nbsp;var1-5 &nbsp;и таблицей &nbsp;data ? Будут ли они храниться в окружении данной функции или уничтожатся? Если &nbsp;data &nbsp;будут храниться, то не будет ли расточительством делать переменные &nbsp;var1-5 ? (т.к. это по сути копии таблицы &nbsp;data ). Просто мне удобно использовать &nbsp;var1-5 &nbsp;(т.к. легче обращаться к значениям по имени переменной, а не по индексу в в таблице &nbsp;data ), но в то же время опасаюсь, что это будет лишним засорением памяти.<br /> <br /><br />// Появилась ещё идея, после ввода переменных &nbsp;var1-5 &nbsp;выполнить код: &nbsp;data &nbsp;= nil. Что скажете?<br />=============<br />обращение через локальные переменные и через индексные в массиве отличается тем, что локальные - это копия элементов, а индексное значение - это указатель.<br />Если Вы в функции сделаете так:<br />var1=0<br />то привыходе из функцию таблица data не изменится<br />а если сделать так<br />data&#91;1&#93;=0<br />то при выходе в таблице первый элемент будет равен 0.<br />---------------------------<br />Что касается затрат памяти, то после завершения вызова, освободившуюся память соберет сборщик мусора.<br />---------------------------<br />Если Вы много раз обращаетесь к данным внутри функции, то использование локальных переменных будет быстрее.<br />-------------------------<br />Резюме: Делайте как удобно. <br />
			<i>21.08.2017 05:38:12, Николай  Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message26343/topic3018/</link>
			<guid>http://forum.quik.ru/messages/forum10/message26343/topic3018/</guid>
			<pubDate>Mon, 21 Aug 2017 05:38:12 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Локальные переменные</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message26342/topic3018/">Локальные переменные</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Kti3bGrQ" href="/user/6717/" bx-tooltip-user-id="6717">Иван Джеммер</a> написал:<br /><br />====quote====<br />Если локальные переменные уничтожаются при выходе из функции, почему тогда мы сможем прочесть локальную переменную 'var'<br />=============<br /><br />=============<br />Таким образом, вызывая func_2 (или var_func) Вы не читаете переменную var, а обращаетесь к копии её значения, сохраненной в стеке функции func_2 <br />
			<i>21.08.2017 00:33:29, Алексей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message26342/topic3018/</link>
			<guid>http://forum.quik.ru/messages/forum10/message26342/topic3018/</guid>
			<pubDate>Mon, 21 Aug 2017 00:33:29 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Локальные переменные</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message26341/topic3018/">Локальные переменные</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Вы создали объект (тип функция) &quot;function() &nbsp;print(var) end&quot;, в замыкании которого (по сути, в исходной настройке стека для вызова этой функции) сохранили строку 'abc' в качестве стартового значения теперь уже локальной для созданной функции переменной var.<br />Указатель на этот объект (функцию) вы сохранили в глобальной переменной func_2, затем значение этого указателя скопировали в локальную для модуля переменную var_func.<br />Когда завершилось выполнение функции, указатель на которую Вы сохранили в глобальной переменной func, стек этой функции выгрузился из памяти, а вместе с ним и выгрузилась из памяти переменная var.<br />Но, повторюсь, в стеке функции, указатель на которую сохранился в переменных func_2 и var_func, сохранилось значение var (а не указатель на нее), которое в ней хранилось на момент создания объекта - функции.<br />Дело в том, что при создании функции в ее объекте сохраняется не только сам ее код, но и ее стартовый стек, в котором сохраняются, кроме всего прочего, значения всех внешних по отношении к ней локальных переменных, использованных в ее коде.<br />Почитайте про &quot;замыкания функций lua&quot;. <br />
			<i>21.08.2017 00:27:04, Алексей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message26341/topic3018/</link>
			<guid>http://forum.quik.ru/messages/forum10/message26341/topic3018/</guid>
			<pubDate>Mon, 21 Aug 2017 00:27:04 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Локальные переменные</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message26340/topic3018/">Локальные переменные</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			В lua нет прямого объявления глобальных переменных, но я для простоты понимания &quot;внесу&quot; в программу этот &quot;оператор&quot; для лучшего понимания Вами Вашего кода:
====code====
<pre>global func, func_2

local var_func -- локальная переменная, время жизни которой - это время пока данный модуль находится в памяти. 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- Если не заморачиваться с выгрузкой модулей из памяти, то эта переменная существует пока исполняется программа (как и все глобальные), просто она не видима в других модулях.

func = function()
&nbsp;&nbsp; local var = 'abc' -- Создаем локальную переменную
&nbsp;&nbsp; 
&nbsp;&nbsp; func_2 = function()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(var)
&nbsp;&nbsp; end
&nbsp;&nbsp; 
&nbsp;&nbsp; var_func = func_2 -- сохраняем во внешнюю переменную созданную функцию
&nbsp;&nbsp; 
&nbsp;&nbsp; -- Выход из функции, локальная переменная 'var' уничтожается.
end

func()

var_func() -- по сути запускаем ранее созданную функцию func_2

-- ВЫВОД: 'abc'
</pre>
============= <br />
			<i>20.08.2017 23:49:29, Алексей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message26340/topic3018/</link>
			<guid>http://forum.quik.ru/messages/forum10/message26340/topic3018/</guid>
			<pubDate>Sun, 20 Aug 2017 23:49:29 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Локальные переменные</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message26337/topic3018/">Локальные переменные</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Sni0iY4W" href="/user/3010/" bx-tooltip-user-id="3010">Алексей</a> написал:<br />При выходе из функции переменные var1-5 будут уничтожены.<br />=============<br />А если такой код:
====code====
<pre>local var_func

function func()
&nbsp;&nbsp; local var = 'abc' -- Создаем локальную переменную
&nbsp;&nbsp; 
&nbsp;&nbsp; function func_2()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(var)
&nbsp;&nbsp; end
&nbsp;&nbsp; 
&nbsp;&nbsp; var_func = func_2 -- сохраняем во внешнюю переменную созданную функцию
&nbsp;&nbsp; 
&nbsp;&nbsp; -- Выход из функции, локальная переменная 'var' уничтожается.
end

func()

var_func() -- по сути запускаем ранее созданную функцию func_2

-- ВЫВОД: 'abc'
</pre>
=============
Если локальные переменные уничтожаются при выходе из функции, почему тогда мы сможем прочесть локальную переменную 'var'? <br />
			<i>20.08.2017 20:38:48, Иван Джеммер.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message26337/topic3018/</link>
			<guid>http://forum.quik.ru/messages/forum10/message26337/topic3018/</guid>
			<pubDate>Sun, 20 Aug 2017 20:38:48 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Локальные переменные</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message26335/topic3018/">Локальные переменные</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_x0qF7K0i" href="/user/3010/" bx-tooltip-user-id="3010">Алексей</a> написал:<br />При выходе из функции переменные var1-5 будут уничтожены. С самой таблицей data нечего не случится.<br /><br />=============<br />Уточнение: под самой таблица data, подразумевается переменная, переданная в функцию в качестве аргумента. Что касается переменной, видимой внутри функции в качестве аргумента, то она является локальной и, соответственно, &quot;живет&quot; только пока функция выполняется. Как-то специально ее уничтожать для экономии памяти не нужно. <br />
			<i>20.08.2017 17:33:42, Алексей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message26335/topic3018/</link>
			<guid>http://forum.quik.ru/messages/forum10/message26335/topic3018/</guid>
			<pubDate>Sun, 20 Aug 2017 17:33:42 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Локальные переменные</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message26334/topic3018/">Локальные переменные</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			При выходе из функции переменные var1-5 будут уничтожены. С самой таблицей data нечего не случится.<br />Если в функции выполнить data = nil, где data - внешняя по отношению к функции переменная, то таблица будет уничтожена. Если data - это аргумент функции (по сути - её локальная переменная), то с внешней таблицей (переданной в функцию в качестве аргумента) ничего не случится.<br />Модификация переменных var1-5 никак не отразится на содержимом внешней таблицы data, за исключением ситуации, когда элементом таблицы data, в свою очередь является таблица. Тогда модификация ее элементов (полей) будет менять содержимое data (например, var4.code = 5 - меняет содержимое data&#91;4&#93;.code) <br />
			<i>20.08.2017 17:23:17, Алексей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message26334/topic3018/</link>
			<guid>http://forum.quik.ru/messages/forum10/message26334/topic3018/</guid>
			<pubDate>Sun, 20 Aug 2017 17:23:17 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Локальные переменные</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message26331/topic3018/">Локальные переменные</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			В функцию в качестве аргумента приходит таблица data = { 'a', 'b', 'c', 'd', 'e' }<br />Для удобства я делаю следующее:<br /><br />local var1 = data&#91;1&#93;<br />local var2 = data&#91;2&#93;<br />local var3 = data&#91;3&#93;<br />local var4 = data&#91;4&#93;<br />local var5 = data&#91;5&#93;<br /><br />Вопрос состоит в следующем: при выходе из этой функции, что случится с переменными <U>var1-5</U> и таблицей <U>data</U>? Будут ли они храниться в окружении данной функции или уничтожатся? Если <U>data</U> будут храниться, то не будет ли расточительством делать переменные <U>var1-5</U>? (т.к. это по сути копии таблицы <U>data</U>). Просто мне удобно использовать<U> var1-5</U> (т.к. легче обращаться к значениям по имени переменной, а не по индексу в в таблице <U>data</U>), но в то же время опасаюсь, что это будет лишним засорением памяти.<br /> <br /><br />// Появилась ещё идея, после ввода переменных <U>var1-5</U> выполнить код: <U>data</U> = nil. Что скажете? <br />
			<i>20.08.2017 13:39:22, Иван Джеммер.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message26331/topic3018/</link>
			<guid>http://forum.quik.ru/messages/forum10/message26331/topic3018/</guid>
			<pubDate>Sun, 20 Aug 2017 13:39:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
