<?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>Thu, 30 Apr 2026 23:04:55 +0300</pubDate>
		<item>
			<title>Итераторы на Луа</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message36167/topic4250/">Итераторы на Луа</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_e4e5684M" href="/user/3905/" bx-tooltip-user-id="3905">Let_it_go</a> написал:<br /><noindex><a href="/user/7362/" target="_blank" rel="nofollow">Enfernuz</a></noindex>, <br />в первом коде 
====code====
<pre>&nbsp;&nbsp; local&nbsp;&nbsp;element&nbsp;&nbsp;=&nbsp;&nbsp;values(t)()&nbsp;&nbsp; </pre>
=============
 со скобками в конце не является эквивалентом &nbsp;
====code====
<pre>&nbsp;&nbsp; local&nbsp;&nbsp;element&nbsp;&nbsp;=&nbsp;&nbsp;iter()&nbsp;&nbsp;</pre>
=============
 потому что выводит до бесконечности<br /> <br />=============<br /><br />Верно, это не эквивалент. Т.е. так можно, но нужно ли - вопрос.<br />Мы же с Вами подобное уже обсуждали в предыдущей ветке: <noindex><a href="https://forum.quik.ru/messages/forum10/message35815/topic4169/#message35815" target="_blank" rel="nofollow">https://forum.quik.ru/messages/forum10/message35815/topic4169/#message35815</a></noindex> <br />
			<i>05.02.2019 07:02:23, vgi.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message36167/topic4250/</link>
			<guid>http://forum.quik.ru/messages/forum10/message36167/topic4250/</guid>
			<pubDate>Tue, 05 Feb 2019 07:02:23 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Итераторы на Луа</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message36166/topic4250/">Итераторы на Луа</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Насчёт кода с allwords разобрался.<br />Вызывать надо так:<br />
====code====
<pre>for word in allwords() do
print(word)
end</pre>
============= <br />
			<i>05.02.2019 06:50:51, Let_it_go.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message36166/topic4250/</link>
			<guid>http://forum.quik.ru/messages/forum10/message36166/topic4250/</guid>
			<pubDate>Tue, 05 Feb 2019 06:50:51 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Итераторы на Луа</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message36165/topic4250/">Итераторы на Луа</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			видимо, это как-то связано с тем, про что я сейчас читаю: замыкания, запоминание состояний... <br />
			<i>05.02.2019 06:39:07, Let_it_go.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message36165/topic4250/</link>
			<guid>http://forum.quik.ru/messages/forum10/message36165/topic4250/</guid>
			<pubDate>Tue, 05 Feb 2019 06:39:07 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Итераторы на Луа</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message36164/topic4250/">Итераторы на Луа</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_sGm7L8UM" href="/user/7362/" bx-tooltip-user-id="7362">Enfernuz</a>, <br />в первом коде
====code====
<pre>local element = values(t)() </pre>
=============
со скобками в конце не является эквивалентом 
====code====
<pre>local element = iter()</pre>
=============
потому что выводит до бесконечности<br /><img src="http://dl3.joxi.net/drive/2019/02/05/0011/1313/742689/89/c21ff6b805.png" alt="Пользователь добавил изображение" border="0" /> <br />
			<i>05.02.2019 06:38:14, Let_it_go.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message36164/topic4250/</link>
			<guid>http://forum.quik.ru/messages/forum10/message36164/topic4250/</guid>
			<pubDate>Tue, 05 Feb 2019 06:38:14 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Итераторы на Луа</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message36163/topic4250/">Итераторы на Луа</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><br />Этот код будет выводить Вам все слова из введённой строки, пока Вы не введёте пустую строку. Если не проверять на ввод пустой строки, то программа сама не завершится, т.к. пустая строка -- это всё ещё строка (т.е. не nil).<br />=============<br />Всё же оно чуть по другому работает. <br /><img src="http://dl4.joxi.net/drive/2019/02/05/0011/1313/742689/89/06669b7295.png" alt="Пользователь добавил изображение" border="0" /><br />дублирует одну строку. Если бы я как-то ухитрился ввести здесь 10 строк, он бы выдал 10 строк. Но не понятно как в этом окошке ввести ради тестов более чем 1 строку. <br />
			<i>05.02.2019 06:33:32, Let_it_go.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message36163/topic4250/</link>
			<guid>http://forum.quik.ru/messages/forum10/message36163/topic4250/</guid>
			<pubDate>Tue, 05 Feb 2019 06:33:32 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Итераторы на Луа</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message36161/topic4250/">Итераторы на Луа</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Вторую функцию вызывайте через allwords()() (соответственно, к предыдущему посту: values(t)() -- так можно). Сама функция возвращает функцию-генератор. Функция-генератор -- это такая функция, которая сохраняет некое состояние между её вызовами.<br /><br />
====code====
<pre>function allwords ()
&nbsp;&nbsp; local line = io.read() -- текущая строка
&nbsp;&nbsp; local pos = 1 -- текущая позиция в строке
&nbsp;&nbsp; return function () -- итерирующая функция
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while line do -- повторяет, пока есть строки
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local s, e = string.find(line, "%w+", pos)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if s then -- слово найдено?
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos = e + 1 -- следующая позиция после этого слова
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(string.sub(line, s, e))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string.sub(line, s, e) -- возвращает это слово
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line = io.read() -- слово не найдено; пробуетследующую строку
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if string.len(line) == 0 then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line = nil 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos = 1 -- перезапуск с первой позиции
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return nil -- строк больше нет; конец обхода
&nbsp;&nbsp; end
end

local fetch_next_word = allwords()
while fetch_next_word() do end
</pre>
=============
<br />Этот код будет выводить Вам все слова из введённой строки, пока Вы не введёте пустую строку. Если не проверять на ввод пустой строки, то программа сама не завершится, т.к. пустая строка -- это всё ещё строка (т.е. не nil). <br />
			<i>05.02.2019 01:14:44, Enfernuz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message36161/topic4250/</link>
			<guid>http://forum.quik.ru/messages/forum10/message36161/topic4250/</guid>
			<pubDate>Tue, 05 Feb 2019 01:14:44 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Итераторы на Луа</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message36160/topic4250/">Итераторы на Луа</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Т.е., проще говоря, присваивание iter = values(t) записывает в iter ссылку на функцию-итератор (генератор), и присваивание element = values(t) делает то же самое. А вот уже вызов этой функции даст вам следующий элемент таблицы-массива. <br />
			<i>05.02.2019 00:35:11, Enfernuz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message36160/topic4250/</link>
			<guid>http://forum.quik.ru/messages/forum10/message36160/topic4250/</guid>
			<pubDate>Tue, 05 Feb 2019 00:35:11 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Итераторы на Луа</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message36159/topic4250/">Итераторы на Луа</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			У Вас values(t) возвращает функцию. Соответственно, Вы её и вызываете посредством iter().<br />Не помню, легален ли такой синтаксис, но попробуйте values(t)(). <br />
			<i>05.02.2019 00:32:08, Enfernuz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message36159/topic4250/</link>
			<guid>http://forum.quik.ru/messages/forum10/message36159/topic4250/</guid>
			<pubDate>Tue, 05 Feb 2019 00:32:08 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Итераторы на Луа</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message36158/topic4250/">Итераторы на Луа</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			И раз уж пошла такая пьянка, второй вопрос оттуда же.<br />
====code====
<pre>function allwords ()
&nbsp;&nbsp;&nbsp;local line = io.read() -- текущая строка
&nbsp;&nbsp;&nbsp;local pos = 1 -- текущая позиция в строке
&nbsp;&nbsp;&nbsp;return function () -- итерирующая функция
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while line do -- повторяет, пока есть строки
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local s, e = string.find(line, "%w+", pos)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if s then -- слово найдено?
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos = e + 1 -- следующая позиция после этого слова
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(string.sub(line, s, e))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string.sub(line, s, e) -- возвращает это слово
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line = io.read() -- слово не найдено; пробуетследующую строку
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos = 1 -- перезапуск с первой позиции
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;return nil -- строк больше нет; конец обхода
&nbsp;&nbsp;&nbsp;end
end</pre>
=============
Как эту функцию вызвать?<br />io.read считывает вводимый мною текст, и ничего не просиходит<br /><img src="http://dl4.joxi.net/drive/2019/02/04/0011/1313/742689/89/9a32e2ca00.png" alt="Пользователь добавил изображение" border="0" /> <br />
			<i>04.02.2019 23:32:42, Let_it_go.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message36158/topic4250/</link>
			<guid>http://forum.quik.ru/messages/forum10/message36158/topic4250/</guid>
			<pubDate>Mon, 04 Feb 2019 23:32:42 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Итераторы на Луа</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message36157/topic4250/">Итераторы на Луа</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Читаю книжку Иерусалимскиса про Луа.<br />Вот код оттуда.<br />
====code====
<pre>function values (t)
&nbsp;&nbsp;&nbsp;local i = 0
&nbsp;&nbsp;&nbsp;return function () i = i + 1; return t&#91;i&#93; end
end

t = {10, 20, 30}
iter = values(t) -- создает итератор
while true do
&nbsp;&nbsp;&nbsp;local element = iter() -- вызывает итератор
&nbsp;&nbsp;&nbsp;if element == nil then break end
&nbsp;&nbsp;&nbsp;print(element)
end</pre>
=============
Код работает как запланировано:<br /><img src="http://dl4.joxi.net/drive/2019/02/04/0011/1313/742689/89/1fb39e2b5b.png" alt="Пользователь добавил изображение" border="0" /><br /><br />Почему всё становится плохо, если строку 
====code====
<pre>local element = iter() -- вызывает итератор</pre>
=============
заменить на 
====code====
<pre>local element = values(t)</pre>
=============
<img src="http://dl4.joxi.net/drive/2019/02/04/0011/1313/742689/89/aeeb3349c0.png" alt="Пользователь добавил изображение" border="0" /><br />Чем отличаются эти варианты? <br />
			<i>04.02.2019 23:11:22, Let_it_go.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message36157/topic4250/</link>
			<guid>http://forum.quik.ru/messages/forum10/message36157/topic4250/</guid>
			<pubDate>Mon, 04 Feb 2019 23:11:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
