<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Linux Forum &mdash; Lua: ipairs vs for i = 1, #table]]></title>
	<link rel="self" href="https://linuxforum.ru/extern.php?action=feed&amp;tid=33497&amp;type=atom" />
	<updated>2014-01-31T18:06:23Z</updated>
	<generator>PunBB</generator>
	<id>https://linuxforum.ru/viewtopic.php?id=33497</id>
		<entry>
			<title type="html"><![CDATA[Re: Lua: ipairs vs for i = 1, #table]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=391087#p391087" />
			<content type="html"><![CDATA[<p>в перле это хеши,<br />причем работают одинаково быстро для любого количества ключ =&gt; значение</p><p>так же существуют<br />массивы<br />массивы хешей<br />хеши массивов</p>]]></content>
			<author>
				<name><![CDATA[moshell]]></name>
				<uri>https://linuxforum.ru/profile.php?id=20870</uri>
			</author>
			<updated>2014-01-31T18:06:23Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=391087#p391087</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Lua: ipairs vs for i = 1, #table]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=391086#p391086" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[xxblx]]></name>
				<uri>https://linuxforum.ru/profile.php?id=17372</uri>
			</author>
			<updated>2014-01-31T17:57:17Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=391086#p391086</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Lua: ipairs vs for i = 1, #table]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=391048#p391048" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[xxblx]]></name>
				<uri>https://linuxforum.ru/profile.php?id=17372</uri>
			</author>
			<updated>2014-01-31T14:43:28Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=391048#p391048</id>
		</entry>
</feed>
