
Рома
23.04.2017
07:38:54
Ага, я понял, это реализация асинхронности через udp!
Да?

Snusmumriken
23.04.2017
07:40:05
Имхо очень забавно.
Да, да. Асинхронность в сетевом взаимодействии.
При получении сообщеньки определённого типа, вызываем соответствующий колбек, с аргументами "данное соединение" и "декодированные данные сообщения".
Если нет сообщенек - передаём исполнение кода дальше. Эта штука тоже не блокирует, ежели чё, ибо её задача - встраиваться, например, в игру. Помимо приёма сетевых данных, игрушка должна ещё много что делать, например, рендерить графон.
Примеры использования есть на этом же гите, в state/client и state/server.
В функции client:load и server:init лежат всякие callback:connect или callback:wupdate какой-нибудь. Это оно самое.

Vlad
23.04.2017
14:43:19
как в луне можно реализовать некое подобие инкапсуляции, и можно ли?
а нужно ли?

Google

Vlad
23.04.2017
15:20:02
и кстати если мы делаем в таблице дырки они же так и сохраняются? ну тобишь со временем ничего никуда не смещается и мы постоянно будем иметь таблицу с дырками?
вроде да, но вроде как если катаемся по таблице и копируем ее значения в другую, то дырки не учитываются и очередность не нарушается
то есть если у нас
1- nil | 2- 2 | 3 - 3 | 4 - nil | 5 - 5 | 6 - 6 | 7 - nil | 8 - 8 | 9 - 9
то получим
1 - 2 | 2 - 3 | 3 - 5 | 4 - 6 | 5 - 8 | 6 - 9
причем если копировать через pairs то так катает, через ipairs не работает почему то вообще, что интересно потому как через
#table
к примеру спокойно идет по таблице и выводит результаты не обращая никакого внимания на дырки и их количество
где ты Мумрик?
всегда поймет и обьяснит

Philipp
23.04.2017
15:24:53
Что?

Vlad
23.04.2017
18:04:36
как получить количество аргументов передаваемых функции?
ну если кидать в функцию просто таблицу с ними то одно, а так есть ли способ с обычными аргументами?

Philipp
23.04.2017
18:07:55
Тебе нужно из функции получить количество полученных аргументов?

Vlad
23.04.2017
18:10:28
ну не получить как результат, а просто узнать
думал что то типа если
foo(table) - то там проще, просто считать таблицу,
а можно еще проще, просто через
foo(...)

Рома
23.04.2017
18:13:35
select('#', ...) - количество
сначала погуглил, потом ещё погуглил, я это не знаю откуда знаю, вывод что в гугле довольно базовую вещь найти непросто

Philipp
23.04.2017
18:14:39
Научитесь пользоваться гуглом
Пожалуйста

Рома
23.04.2017
18:15:10
ок, и как это загуглить?

Vlad
23.04.2017
18:15:37
зачем? тут то мы вопросы задаем и ответы получаем, смысл чата тогда?

Philipp
23.04.2017
18:15:40
vararg lua
how to get number of arguments in vararg function lua

Google

Philipp
23.04.2017
18:16:11
А не спрашивать то, что написано в официальном мане языка

Vlad
23.04.2017
18:17:11

Рома
23.04.2017
18:17:53
да я вот думаю портал о луа, надо, не надо, склоняюсь к тому что не надо, но блин а вдруг что-то хорошее получилось бы
вот уже название и шапочку придумал
если все гуглится

Snusmumriken
23.04.2017
18:30:07
Ох :3
Таблицы с дырками - это проблема. Старайтесь не делать таблиц с дырками.
ipairs идёт по таблице пока не наткнётся на дырку, #tbl показывает предельное значение в таблице.
Для таблиц с дырками, по хорошему, стоит мутить отдельный класс, со своим итератором, и метаметодом __newindex, который затыкает дырки при добавлении новых значений.
А лучше - связный список.

Vlad
23.04.2017
19:47:57
какой вариант лучше?
такой :
tab[1] = function(arg1) --[[work with]] end
tab[2] = function(arg1,arg2) --[[work with]] end
tab[3] = function(arg1,arg2,arg3) --[[work with]] end
tab[N] = function(arg1,arg2,arg3,argN) --[[work with]] end
или такой :
function tab.func1(arg1) --[[work with]] end
function tab.func2(arg1,arg2) --[[work with]] end
function tab.func3(arg1,arg2,arg3) --[[work with]] end
function tab.funcN(arg1,arg2,arg3,argN) --[[work with]] end
хотя сам больше к первому

Snusmumriken
23.04.2017
19:49:27
Такой:
function tab(...) local args = {...} [work with] end

Рома
23.04.2017
19:50:13
Между прочим, {...} лишний раз - плохо, так как лишняя табличка - зло
select отлично справляется

Snusmumriken
23.04.2017
19:50:29
Да, в таких случаях можно пользоваться селектом.
Хех, кстати забавная идея, сделать итератор для множества аргументов, без плодения таблиц.

Vlad
23.04.2017
19:51:32
ние ние, предположм тиаритишски что тут простые но в тоже время сложные потуги сделать перегрузку
я не делал много фукнций с разными переменными только потому что не хочу работать со всеми разом, просто от количества меняем поведение
а с селектом да
local num = select( "#", ... )
а потом просто тыкаем этим куда нужно

Snusmumriken
23.04.2017
19:55:36
Хех, столкнулся с забавной ошибкой на итераторе:
function itouple(...)
local i = 0
return function()
i = i + 1
local v = select(i, ...)
if v then return i, v end
end
end
for i, v in itouple('a', 'b', 'c', 10, 20, 30) do
print(i, v)
end
Ошибка:
cannot use '...' outside a vararg function near '...'

Рома
23.04.2017
19:57:03
> Между прочим, {...} лишний раз - плохо, так как лишняя табличка - зло
В этом случае {...} это не лишний раз
а необходимый

Snusmumriken
23.04.2017
19:57:47
Если функция не так часто вызывается - то норм.
Или если памяти много и тебе пофиг на сборку мусора.
На работке, у серверов обычно гигов 32-128 памяти, там пофигу на мусор, лишь бы быстро отработало.

Рома
23.04.2017
19:58:19
вероятно, ... это фича самого языка и он дергает переменные прямо из стека, вот и не может к ним обращаться потом когда-нибудь из колбека
все логично!

Google

Snusmumriken
23.04.2017
20:00:10
... - это скрытый тип данных, называется "кортеж".
Они же используются при присвоениях:
a, b, c = c, a, b
Фактически, тут создаются два кортежа, которые обмениваются значениями, и по указателям на переменные заполняются новые значения конечного кортежа. Поэтому это так работает.
И, возможно, кортежи не могут существовать в замыканиях, потому что тип данных рассчитан не на хранение а на моментальное использование. Возможно, как раз за счёт хранения на стеке.

Рома
23.04.2017
20:01:53
c, a, b могут быть в любом порядке?
... строго слева направо достается селектом
вот и не верю, это стек
может пруф на сорц?

Snusmumriken
23.04.2017
20:04:31
Ну как тебе сказать.
a, b, c = 10, 20, 30
a, b, c = c, b, a -> 30, 20, 10
Переменные спокойно меняются значениями.
function foo(...) local a, b, c = ...; return a, b, c end
print(foo(10, 20, 30, 40, 50, 60)) -> 10, 20, 30
А select - функция для работы с кортежами, да.
unpack - превращает таблицу в кортеж.

Рома
23.04.2017
20:06:41
Я о том, что когда пишешь на сишечке по луа апи, то там есть стек - очередь значений, и можно их пушить, то есть перебирать поочередно, a, b, c = ... поочередно достает значения из этого стека
при чем тут котреж?
как текст разукрашиваешь?

Snusmumriken
23.04.2017
20:08:29
Ох, а я про то как ты пользуешься луа-фигнёй :3
Кстати, стак луа-машины и стак процессорный - разные штуки.
Стак машины - считай что обычный массив, в который можно напихать значений для того чтобы передать в луа и из луа.
Ну, точнее массив структур с типами и указателями на куски памяти с данной структурой. Всякие pushnumber/pushtable - делают грязную работу типизации.

Snusmumriken
23.04.2017
20:19:29
Да, кажется, мне скоро надоест описывать всякую лабуду типа кортежей каждый раз новым людям, поэтому есть смысл замутить блок с "частыми вопросами".

Ruslan
23.04.2017
20:21:46
Бота-справочника написать и в чат добавить ?

Snusmumriken
23.04.2017
20:22:46
Отвечать он будет в манере:
"Ну ёб вашу мать, это же и дебилам понятно, что такое кортежи, дуй в википедию блин а то чо как лох".
Теперь мне нравится эта идея ещё больше.

Philipp
23.04.2017
20:26:41

Рома
23.04.2017
20:26:43
В википедии непонятно написано

Philipp
23.04.2017
20:26:47
Кто агрится на примитивные вопросы(

Admin
ERROR: S client not available

Snusmumriken
23.04.2017
20:27:15
Ну, я не агрюсь, а бот будет агриться в шутливой манере, потому что это весело :3

Google

Alex Фэils?︙
23.04.2017
20:27:20

Snusmumriken
23.04.2017
20:27:48
Во, у меня есть бот, который умеет в несмешные цитаты с башорга. Это тоже можно.

Vlad
23.04.2017
20:48:34
чрезмерное количество таблиц сильное зло?

Snusmumriken
23.04.2017
20:50:32
Чрезмерное количество чего угодно - всегда зло. Чрезмерное же.
Со строками та же фигня.
В целом - чем меньше плодится в часто вызываемых функциях - тем лучше.
Чем реже вызывается функция, тем пофигистичнее.

Vlad
23.04.2017
20:52:39
table[][][]
ну значит такие конструкции уже зашквар?

Philipp
23.04.2017
20:54:50

Snusmumriken
23.04.2017
20:55:12
Если критично к скорости исполнения - да.
А, да, table[][][] - не зашквар, если объявляется один раз а потом используется.
Если объявляется локально, потом заполняется тысячами значений и почти тут же удаляется и так происходит много раз в секунду на критичных к скорости/потреблению памяти местах - зашквар.

Vlad
23.04.2017
21:16:19
карочи рубрика,
а я вам тут сладкого хлебушка покушать занес


Snusmumriken
23.04.2017
21:52:41
Попробую замутить свой удобный оверлоад, с типизацией.
Фактически, это табличка со списком
{numbernumberstring = function() ... end},
а при вызове - проверяются аргументы и вызывается соответствующая типам аргуметов функция.
Если опираться не на типы а на количество - можно гораздо быстрее исполнять, но не так удобно.
Но зато встроенная проверка типов, что не может не радовать.
То же самое, но с ориентацией на количество аргументов.
Когда важнее скорость.
Можно и в более ООПшном стиле но лень.
function simpleloaded()
local o, mt = {}, {}
function o.add(count, f)
o[count] = f
end
function mt:__call(...)
local f = self[select('#', ...)]
if f then
return f(...)
else
error('No function with #'..select('#', ...)..' keys')
end
end
return setmetatable(o, mt)
end
foo = simpleloaded()
foo.add(0, function() return 10 end)
foo.add(1, function(a) return a + 10 end)
foo.add(2, function(a, b) return a + b + 10 end)
foo() -> 10
foo(10) -> 20
foo(10, 20) -> 40
foo(10, 20, 30) -> error
Такие пироги.


Group Butler [beta]
24.04.2017
07:34:54
Добро пожаловать в чат pro.lua, Alex! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

fgntfg
24.04.2017
08:03:06
А разьве нельзя написать что-то типа
function add(...)
local t = {...}
for _,a in pairs(t)
if(typeof(a)=='number') end
if(typeof(a)=='string') end
etc
мне кажется вы переусложняете

Snusmumriken
24.04.2017
08:32:54
Можно. Я обычно так и делаю, но товарищ хочет перегрузку с разными функциями под разные типы.
Плюс сильно зависит от того, сколько всякой перегруженной фигни в модуле. Если одна-две функции, то норм. Если штук двадцать (допустим, библиотека работы с векторами, которая воспринимает как векторы так и числа и таблицы в качестве аргументов) - то задолбаешься. Я про крайней мере задолбался пока делал, и писал отдельные помогающие функции.

fgntfg
24.04.2017
08:34:49
можно сделать таблицу
c = table[typeof(var)](a,b)

Snusmumriken
24.04.2017
08:37:10
Прохожий вариант в моем первом примере. И, прошу заметить, он довольно удобный.

Google

Group Butler [beta]
25.04.2017
14:17:40
Добро пожаловать в чат pro.lua, Marina! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Marina
25.04.2017
14:17:43
Ребята, может кому-то полезен будет бесплатный митапчик от мейла по аналитике мобильных приложений?) https://corp.mail.ru/ru/press/events/339/

Alex
25.04.2017
14:24:05

Octo@dshacks
25.04.2017
15:02:00
Пора допиливать моего бота-фильтра
Чтоб все мэилрушные ссылки блочил