<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: setmetatable]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме setmetatable форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sat, 02 May 2026 22:45:00 +0300</pubDate>
		<item>
			<title>setmetatable</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39133/topic2379/">setmetatable</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			====code====
<pre>t = setmetatable({vol = 0,
&nbsp;&nbsp;ins ert = function(self, pos, value)
&nbsp;&nbsp;&nbsp;&nbsp;if not value then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos, value = #self + 1, pos
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;self.vol = self.vol + value
&nbsp;&nbsp;&nbsp;&nbsp;table.ins ert(self, pos, value)
&nbsp;&nbsp;end,
&nbsp;&nbsp;remove = function(self, pos)
&nbsp;&nbsp;&nbsp;&nbsp;self.vol = self.vol - self&#91;pos&#93;
&nbsp;&nbsp;&nbsp;&nbsp;table.remove(self, pos)
&nbsp;&nbsp;end
}, {__newindex = function(self, key, value)
&nbsp;&nbsp;&nbsp;&nbsp;self.vol = self.vol + val ue
&nbsp;&nbsp;&nbsp;&nbsp;rawset(self, key, val ue)
&nbsp;&nbsp;end})</pre>
=============
Вроде, работает:<br />
====code====
<pre>t&#91;1&#93; = 3
t:insert(2, 2)
t:insert(3, 5)
t:remove(2)</pre>
============= <br />
			<i>31.07.2019 23:48:13, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39133/topic2379/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39133/topic2379/</guid>
			<pubDate>Wed, 31 Jul 2019 23:48:13 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>setmetatable</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39132/topic2379/">setmetatable</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_xGEOjmV2" href="/user/47/" bx-tooltip-user-id="47">s_mike@rambler.ru</a> написал:<br />пересчитывать итоги каждый раз при попытке извлечь значение по ключ vol<br />=============<br />Думаю, будет накладно в общем случае, т.к. надо будет при каждом обращении к vol пробегать по всем элементам таблицы. Хотелось бы более элегантного решения. <br />
			<i>31.07.2019 23:27:11, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39132/topic2379/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39132/topic2379/</guid>
			<pubDate>Wed, 31 Jul 2019 23:27:11 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>setmetatable</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39130/topic2379/">setmetatable</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Можно убрать из вашей таблицы поле vol вообще и пересчитывать итоги каждый раз при попытке извлечь значение по ключ vol, &nbsp;которое пусто. &nbsp;Для этого есть мета метод __index. &nbsp;<br /><br />накладно это или нет - вам виднее <br />
			<i>31.07.2019 23:15:28, s_mike@rambler.ru.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39130/topic2379/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39130/topic2379/</guid>
			<pubDate>Wed, 31 Jul 2019 23:15:28 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>setmetatable</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39126/topic2379/">setmetatable</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			При добавлении в таблицу сделал:<br />
====code====
<pre>t = setmetatable({vol = 0}, {__newindex = function(self, key, value)
&nbsp;&nbsp;self.vol = self.vol + value
end})
t&#91;1&#93; = 3
t&#91;2&#93; = 2
t&#91;3&#93; = 5
print(t.vol)&nbsp;&nbsp;--&#62; 10</pre>
=============
Но не нашёл метаметода при удалении элемента. <br />
			<i>31.07.2019 22:22:05, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39126/topic2379/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39126/topic2379/</guid>
			<pubDate>Wed, 31 Jul 2019 22:22:05 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>setmetatable</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39125/topic2379/">setmetatable</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			====code====
<pre>local t = {vol = 0}
table.insert(t, 1, 3)&nbsp;&nbsp;--&#62;&nbsp;&nbsp;t.vol = 3
table.insert(t, 2, 2)&nbsp;&nbsp;--&#62;&nbsp;&nbsp;t.vol = 5
table.insert(t, 3, 5)&nbsp;&nbsp;--&#62;&nbsp;&nbsp;t.vol = 10
table.remove(t, 2)&nbsp;&nbsp;&nbsp;&nbsp; --&#62;&nbsp;&nbsp;t.vol = 8</pre>
=============
<br />Можно сделать через метатаблицу, чтобы при добавлении/удалении элемента в таблице в vol автоматически изменялась сумма всех индексных элементов? <br />
			<i>31.07.2019 21:42:27, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39125/topic2379/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39125/topic2379/</guid>
			<pubDate>Wed, 31 Jul 2019 21:42:27 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>setmetatable</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message21139/topic2379/">setmetatable</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Понял, спасибо!<br /><br />
====code====
<pre>s = setmetatable({}, {__index = function(t, i)
&nbsp;&nbsp;local result = i * i
&nbsp;&nbsp;t&#91;i&#93; = result 
&nbsp;&nbsp;return result 
end})</pre>
============= <br />
			<i>18.12.2016 10:20:02, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message21139/topic2379/</link>
			<guid>http://forum.quik.ru/messages/forum10/message21139/topic2379/</guid>
			<pubDate>Sun, 18 Dec 2016 10:20:02 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>setmetatable</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message21138/topic2379/">setmetatable</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_hho2i728" href="/user/54/" bx-tooltip-user-id="54">Старатель</a> написал:<br />А как это использовать? У меня не кэширует:<br />
====code====
<pre>&nbsp;&nbsp;s&nbsp;&nbsp;=&nbsp;&nbsp;setmetatable({}, { __index&nbsp;&nbsp;=&nbsp;&nbsp; function (t, i)
&nbsp;&nbsp; local&nbsp;&nbsp;result&nbsp;&nbsp;=&nbsp;&nbsp; print ( 'Считаем...' )&nbsp;&nbsp;or&nbsp;&nbsp;i&nbsp;&nbsp;*&nbsp;&nbsp;i
&nbsp;&nbsp;t&nbsp;&nbsp;=&nbsp;&nbsp;result 
&nbsp;&nbsp; return&nbsp;&nbsp;result 
 end })
 print (tostring(s&#91; 3 &#93;))
 print (tostring(s&#91; 3 &#93;))&nbsp;&nbsp;</pre>
=============
<br />Результат:<br /><br />====quote====<br />Считаем...<br />9<br />Считаем...<br />9<br />=============<br /><br />=============<br />старатель. При копировании текста из одного сообщения в другое чудесный форум превратил t&#91;i&#93; просто в t.<br /><br />невозможно общаться. Как в арке такую халтуру приняли в виде сайта... <br /><br />позвоните мне скайпом mikemsk - проще словами, чем здесь мучиться. <br />
			<i>17.12.2016 23:33:56, s_mike@rambler.ru.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message21138/topic2379/</link>
			<guid>http://forum.quik.ru/messages/forum10/message21138/topic2379/</guid>
			<pubDate>Sat, 17 Dec 2016 23:33:56 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>setmetatable</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message21135/topic2379/">setmetatable</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			А как это использовать? У меня не кэширует:<br />
====code====
<pre>s = setmetatable({}, { __index = function(t, i)
&nbsp;&nbsp;local result = print('Считаем...') or i * i
&nbsp;&nbsp;t = result 
&nbsp;&nbsp;return result 
end})
print(tostring(s&#91;3&#93;))
print(tostring(s&#91;3&#93;))</pre>
=============
<br />Результат:<br /><br />====quote====<br />Считаем...<br />9<br />Считаем...<br />9<br />=============<br /> <br />
			<i>17.12.2016 21:55:55, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message21135/topic2379/</link>
			<guid>http://forum.quik.ru/messages/forum10/message21135/topic2379/</guid>
			<pubDate>Sat, 17 Dec 2016 21:55:55 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>setmetatable</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message21133/topic2379/">setmetatable</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_z97fJvyq" href="/user/54/" bx-tooltip-user-id="54">Старатель</a> написал:<br /><br />====quote====<br /> <noindex><a href="mailto:s_mike@rambler.ru" target="_blank" rel="nofollow">s_mike@rambler.ru</a></noindex> &nbsp; написал:<br />s = setmetatable( {}, &nbsp; function(t,i)<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local result = (считаем что-то)<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<I> = result<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return result<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end)<br /></I><br />=============<br /><br />====quote====<br /><I>bad argument #2 to 'setmetatable' (nil or table expected)</I><br />=============<br /><I>Но я понял, что для моей задачи (кэширование только одного элемента таблицы) &nbsp;<noindex><a href="https://forum.quik.ru/messages/forum10/message21099/topic2379/#message21099" target="_blank" rel="nofollow">первый</a></noindex> &nbsp;вариант будет лучше.</I><br />=============<br />я прошу прощения. Конечно должно быть так:<br /><br />s = setmetatable({}, { __index = function(t,i) local result = (считаем что-то)<br />t = result<br />return result<br />end}) <br />
			<i>17.12.2016 19:13:16, s_mike@rambler.ru.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message21133/topic2379/</link>
			<guid>http://forum.quik.ru/messages/forum10/message21133/topic2379/</guid>
			<pubDate>Sat, 17 Dec 2016 19:13:16 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>setmetatable</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message21131/topic2379/">setmetatable</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Y6XIiLm7" href="/user/47/" bx-tooltip-user-id="47">s_mike@rambler.ru</a> написал:<br />s = setmetatable( {}, &nbsp; function(t,i)<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local result = (считаем что-то)<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t[i] = result<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return result<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end)<br /><br />=============<br /><br />====quote====<br />bad argument #2 to 'setmetatable' (nil or table expected)<br />=============<br /><br />Но я понял, что для моей задачи (кэширование только одного элемента таблицы) <noindex><a href="https://forum.quik.ru/messages/forum10/message21099/topic2379/#message21099" target="_blank" rel="nofollow">первый</a></noindex> вариант будет лучше. <br />
			<i>17.12.2016 14:32:04, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message21131/topic2379/</link>
			<guid>http://forum.quik.ru/messages/forum10/message21131/topic2379/</guid>
			<pubDate>Sat, 17 Dec 2016 14:32:04 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>setmetatable</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message21106/topic2379/">setmetatable</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			s = setmetatable( {}, &nbsp; function(t,i)<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local result = (считаем что-то)<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t&#91;i&#93; = result<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return result<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end)<br /><br /><br /><br />теперь расчет каждого поля таблицы s будет проходить единожды.<br /><br />Как я понимаю, вам потребовалось что-то типа <noindex><a href="http://www.bot4sale.ru/blog-menu/qlua/spisok-statej/487-coffee.html" target="_blank" rel="nofollow">этого</a></noindex> <br />
			<i>16.12.2016 11:15:32, s_mike@rambler.ru.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message21106/topic2379/</link>
			<guid>http://forum.quik.ru/messages/forum10/message21106/topic2379/</guid>
			<pubDate>Fri, 16 Dec 2016 11:15:32 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>setmetatable</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message21105/topic2379/">setmetatable</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_yTDfOeN8" href="/user/54/" bx-tooltip-user-id="54">Старатель</a> написал:<br />
====code====
<pre>&nbsp;&nbsp; function&nbsp;&nbsp; func (v)
&nbsp;&nbsp; return&nbsp;&nbsp;v&nbsp;&nbsp;*&nbsp;&nbsp;v
 end 

s&nbsp;&nbsp;=&nbsp;&nbsp;{
&nbsp;&nbsp;f&nbsp;&nbsp;=&nbsp;&nbsp; function (v)
&nbsp;&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp;r&nbsp;&nbsp;=&nbsp;&nbsp;s.r
&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp; not&nbsp;&nbsp;r&nbsp;&nbsp;then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;&nbsp;=&nbsp;&nbsp;func(v)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.r&nbsp;&nbsp;=&nbsp;&nbsp;r
&nbsp;&nbsp;&nbsp;&nbsp; end 
&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp;r
&nbsp;&nbsp; end 
}

 print (tostring( s.f ( 3 )))
 print (tostring( s.f ( 3 )))&nbsp;&nbsp;</pre>
=============
<br />Функция s.f() запоминает вычисленное значение и при повторном обращении возвращает раннее вычисленное значение.<br />Можно ли описать её через setmetatable?<br />PS: возвращать она должна раннее сохранённое значение, независимо от переданного аргумента при повторном вызове.<br />=============<br />setmetatable из числого луа можно использовать для таблиц (хаки не принимаем во внимание). К функциям setmatatable не стоит применять. <br />
			<i>16.12.2016 11:12:17, s_mike@rambler.ru.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message21105/topic2379/</link>
			<guid>http://forum.quik.ru/messages/forum10/message21105/topic2379/</guid>
			<pubDate>Fri, 16 Dec 2016 11:12:17 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>setmetatable</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message21099/topic2379/">setmetatable</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			====code====
<pre>function func(v)
&nbsp;&nbsp;return v * v
end

s = {
&nbsp;&nbsp;f = function(v)
&nbsp;&nbsp;&nbsp;&nbsp;local r = s.r
&nbsp;&nbsp;&nbsp;&nbsp;if not r then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r = func(v)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.r = r
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;return r
&nbsp;&nbsp;end
}

print(tostring(s.f(3)))
print(tostring(s.f(3)))</pre>
=============
<br />Функция s.f() запоминает вычисленное значение и при повторном обращении возвращает раннее вычисленное значение.<br />Можно ли описать её через setmetatable?<br />PS: возвращать она должна раннее сохранённое значение, независимо от переданного аргумента при повторном вызове. <br />
			<i>15.12.2016 23:52:42, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message21099/topic2379/</link>
			<guid>http://forum.quik.ru/messages/forum10/message21099/topic2379/</guid>
			<pubDate>Thu, 15 Dec 2016 23:52:42 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
