<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Linux Forum &mdash; Lua: ipairs vs for i = 1, #table]]></title>
		<link>https://linuxforum.ru/viewtopic.php?id=33497</link>
		<atom:link href="https://linuxforum.ru/extern.php?action=feed&amp;tid=33497&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Lua: ipairs vs for i = 1, #table».]]></description>
		<lastBuildDate>Fri, 31 Jan 2014 18:06:23 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Lua: ipairs vs for i = 1, #table]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=391087#p391087</link>
			<description><![CDATA[<p>в перле это хеши,<br />причем работают одинаково быстро для любого количества ключ =&gt; значение</p><p>так же существуют<br />массивы<br />массивы хешей<br />хеши массивов</p>]]></description>
			<author><![CDATA[null@example.com (moshell)]]></author>
			<pubDate>Fri, 31 Jan 2014 18:06:23 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=391087#p391087</guid>
		</item>
		<item>
			<title><![CDATA[Re: Lua: ipairs vs for i = 1, #table]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=391086#p391086</link>
			<description><![CDATA[<p>Почитал архив почтовой рассылки Lua. Но до конца так и не понял, то ли ipairs() хотели убрать, но передумали, то ли уберут в следующих версиях. Непонятно. <br />По-видимому, это уже довод за for i = 1, #table. Код лишний раз переписывать не придется, если ipairs все-таки выпилят <img src="https://linuxforum.ru/img/smilies/ab.gif" alt="ab" /> <br />Надеюсь, pairs убирать не будут. На ipairs наплевать, а вот без pairs будет неудобно, конечно.</p>]]></description>
			<author><![CDATA[null@example.com (xxblx)]]></author>
			<pubDate>Fri, 31 Jan 2014 17:57:17 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=391086#p391086</guid>
		</item>
		<item>
			<title><![CDATA[Lua: ipairs vs for i = 1, #table]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=391048#p391048</link>
			<description><![CDATA[<p>Всем доброго времени суток. <br />В Lua есть две удобные вещи: pairs и ipairs, предназначенные для использования с таблицами.<br />pairs для таблиц - ассоциативных массивов (ключ - значение). Точнее сказать, pairs обычно используется с ассоциативными массивами, но и с обычными таблицами-массивами тоже работает. <br />ipairs для таблиц - обычных массивов (упорядоченные элементы с последовательными индексами от 1 до &lt;количество_элементов_таблицы&gt;). По сути, разница (относительно pairs) в том, что ключ&nbsp; &quot;целочисленный&quot;, начинается с единицы и по возрастающей с шагом 1. </p><div class="codebox"><pre><code>for i, v in pairs(t) do
  print(i) -- выдаст ключ
  print(v) -- выдаст значение
end</code></pre></div><div class="codebox"><pre><code>&gt; t = { [&quot;A&quot;] = &quot;a&quot;, [&quot;B&quot;] = &quot;b&quot;, [&quot;C&quot;] = &quot;c&quot;}
&gt; for i, v in pairs(t) do
&gt;&gt; print(i)
&gt;&gt; print(v)
&gt;&gt; end
B
b
C
c
A
a</code></pre></div><div class="codebox"><pre><code>for i, v in ipairs(t) do
  print(i) -- выдаст индекс элемента
  print(v) -- выдаст сам элемент
end</code></pre></div><div class="codebox"><pre><code>&gt; t = { &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot; }
&gt; for i, v in ipairs(t) do
&gt;&gt; print(i)
&gt;&gt; print(v)
&gt;&gt; end
1
a
2
b
3
c
4
d</code></pre></div><p>Все вроде бы понятно. Но, как обычно и бывает, способ написанный в документации - не единственный. И чтобы обойти таблицу-массив можно воспользоваться другим вариантом:</p><div class="codebox"><pre><code>-- #t = длина таблицы t
for i = 1, #t do
   print(t[i]) -- выдаст элемент
end</code></pre></div><div class="codebox"><pre><code>&gt; for i = 1, #t do
&gt;&gt; print(t[i])
&gt;&gt; end
a
b
c
d</code></pre></div><p>В Lua 5.2 (в других не проверял) если провести сравнительный тест, то становится наглядно видно, чтобы цикла вида for i = 1, #t отрабатывает раза в 1.5-2 быстрее, чем for i, v in ipairs(t). <br />Откуда берется разница - вроде понятно, for i = 1, #t просто перебирает i с шагом 1, а for i, v in ipairs(t) именно получает значение и индекса, и элемента, по тому и отрабатывает медленней. </p><p>Вопрос в следующем, на какие подводные камни можно наткнутся, если использовать for i = 1, #t для обхода таблицы-массива вместо for i, v in ipairs(t). По тому что хоть for i, v in ipairs(t) вроде и правильней, жертвовать скоростью совсем не хочется. <br />Понятно, что если в цикле предстоит удалять элементы, то for i = 1, #t использовать нельзя<br /></p><div class="codebox"><pre><code>-- на момент начала цикла #t - какое-то конкретное значение типа number
for i = 1, #t do
   if (t[i] == &quot;str&quot;) then
      -- как только удалим элемент, размер таблицы изменится, 
      -- а значит цикл выйдет за пределы таблицы и будет ошибка
      table.remove(t, i)
   end
end</code></pre></div><p>А помимо удаления и подобных операций, когда таблица в ходе цикла будет заметно изменена, есть еще какие-то ситуации, когда использование for i = 1, #t do чревато проблемами? <br />И вообще, что посоветуете: не брезгать &quot;быдлокодить&quot; с for i = 1, #t do раз это дает профит по скорости работы, либо же строго придерживаться ipairs() по тому что &quot;так положено&quot; ?</p>]]></description>
			<author><![CDATA[null@example.com (xxblx)]]></author>
			<pubDate>Fri, 31 Jan 2014 14:43:28 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=391048#p391048</guid>
		</item>
	</channel>
</rss>
