Size: a a a

2020 February 07

S

Snusmumriken in pro.lua
Делай функцию колбека такой, чтобы могла выбирать.

Например, волшебные переключалки:

local main = {}
function main.onFriendMessage(...) end

local ingame = {}
function main.onFriendMessage(...) end

local current = main

function steam.callback.onFriendMessage(...)
 if current.onFriendMessage then
   current.onFriendMessage(...)
   current = ingame
 end
end

Если хочется одновременного вызова — можно завести табличку-список, какие функции надо вызвать.
источник

S

Snusmumriken in pro.lua
Ты — юзер, имеешь право делать как хочется : )
Разработчик библиотеки делает только основной функционал, все нагромождения на совести юзера.
источник

AZ

Aydar Zarifullin in pro.lua
Snusmumriken
Делай функцию колбека такой, чтобы могла выбирать.

Например, волшебные переключалки:

local main = {}
function main.onFriendMessage(...) end

local ingame = {}
function main.onFriendMessage(...) end

local current = main

function steam.callback.onFriendMessage(...)
 if current.onFriendMessage then
   current.onFriendMessage(...)
   current = ingame
 end
end

Если хочется одновременного вызова — можно завести табличку-список, какие функции надо вызвать.
А не лучше ли сделать как в js при работе с dom? Чтобы можно было раскидать кучу

addEventHandler("onSome", userFunc1)

addEventHandler("onSome", userFunc2)
источник

S

Snusmumriken in pro.lua
Это будет как в жаваскрипте : )
Вариант конечно вариантный, но плохо заточено под состояния, а в играх в основном они.
источник

S

Snusmumriken in pro.lua
То есть, при переключении состояния, придётся сначала отзывать все старые события (храня их ID), а потом пихать новые, когда можно было бы просто переключить ссылку на табличку. Плюс хранение списков функций на сишной старане — такое себе дело.

Когда мне в какой-то момент пришлось делать что-то такое:
friend:getAvatar("large", function(...) end)
(потому что вызов асинхронный, а хотелось влепить фичу прям колбековых колбеков), я сделал ещё одну табличку в луёвом регистре, и заполнял её луёвыми функциями (по ключам friend_id), а потом вызывал при случае. На сишке пришлось бы мутить хеши или динамические массивы, добавлять-удалять и делать ещё много неприятных штук. У луа уже есть хеш-массивы, и их можно использовать в т.ч. с сишной стороны.

Пусть луёвые данные хранятся на луёвой стороне, в общем.
источник

AZ

Aydar Zarifullin in pro.lua
Snusmumriken
То есть, при переключении состояния, придётся сначала отзывать все старые события (храня их ID), а потом пихать новые, когда можно было бы просто переключить ссылку на табличку. Плюс хранение списков функций на сишной старане — такое себе дело.

Когда мне в какой-то момент пришлось делать что-то такое:
friend:getAvatar("large", function(...) end)
(потому что вызов асинхронный, а хотелось влепить фичу прям колбековых колбеков), я сделал ещё одну табличку в луёвом регистре, и заполнял её луёвыми функциями (по ключам friend_id), а потом вызывал при случае. На сишке пришлось бы мутить хеши или динамические массивы, добавлять-удалять и делать ещё много неприятных штук. У луа уже есть хеш-массивы, и их можно использовать в т.ч. с сишной стороны.

Пусть луёвые данные хранятся на луёвой стороне, в общем.
Зачем хранить списки функций на сишной стороне?
источник

S

Snusmumriken in pro.lua
addEventHandler("onSome", userFunc1)
Куда отправляется userFunc1? Где оно начинает храниться, чтобы вызываться по событию?
источник

AZ

Aydar Zarifullin in pro.lua
Snusmumriken
addEventHandler("onSome", userFunc1)
Куда отправляется userFunc1? Где оно начинает храниться, чтобы вызываться по событию?
в луевой  табличке разве не покатит?
источник

S

Snusmumriken in pro.lua
1. На сишной стороне в виде int func_ref
2. На луёвой стороне в глобальном реестре (недоступно из луа просто так, типа невидимой но существующей таблицы)
3. На луёвой стороне, где-то в доступной из стейта табличке (вроде той steam.callback)
источник

S

Snusmumriken in pro.lua
Если третий вариант — то в целом возможно. Но есть несколько неприятных штук:
1. Придётся делать схему работы массива с дырками, в противном случае будет непонятен порядок вызовов (хеш не имеет порядка), или айди будет меняться, и пользователь не сможет удалить конкретный колбек. А с сишной стороны это делать неприятно;
2. Получится почти то же что есть, но только со списком, что мог бы сделать сам юзер;
3. Ну типа избыточное нагромождение. Зачем громоздить когда можно не громоздить? Юзеру нужно нагромождение — он себе сделает, функционала достаточно.
источник

S

Snusmumriken in pro.lua
Есть такой страшный принцип, под названием KISS. Можешь загуглить на досуге. Вольная интерпретация — не стоит делать сложнее чем необходимо.
источник

AZ

Aydar Zarifullin in pro.lua
Snusmumriken
Есть такой страшный принцип, под названием KISS. Можешь загуглить на досуге. Вольная интерпретация — не стоит делать сложнее чем необходимо.
Да знаю, но конкретного не теоретического описания не видел.
источник

S

Snusmumriken in pro.lua
Ну вот тебе практическое.
источник

S

Snusmumriken in pro.lua
JS давным-давно ушёл от KISS'а, так что в нём может быть что угодно.
Ты им пользуешься, и не понимаешь что происходит не просто под капотом, а даже просто фоном, и стимула изучения особо нет.

Вот эти вот ЖСовые
let timerId = setTimeout(func|code, [delay], [arg1], [arg2], ...)
автоматически означают, что там помимо, собственно, твоего кода есть цикл событий, система таймеров и ещё куча мишуры, которая работает отдельно от твоего кода.

То есть, всякая мишура на которую ты не можешь повлиять, они будут всегда, самое страшное что ты можешь сделать — их отключить (и то не факт). И всё.
источник

S

Snusmumriken in pro.lua
Я такого предельно стараюсь избежать, делая работу для пользователя прозрачной. Если какое-то действие совершается — это пользователь его совершил, а не "прога сама чот мутит своё". Поэтому и steam.eventPump(). Это действие нужно совершить, иначе никакие колбеки не будут вызываться, даже если прописаны.
источник

AZ

Aydar Zarifullin in pro.lua
Snusmumriken
JS давным-давно ушёл от KISS'а, так что в нём может быть что угодно.
Ты им пользуешься, и не понимаешь что происходит не просто под капотом, а даже просто фоном, и стимула изучения особо нет.

Вот эти вот ЖСовые
let timerId = setTimeout(func|code, [delay], [arg1], [arg2], ...)
автоматически означают, что там помимо, собственно, твоего кода есть цикл событий, система таймеров и ещё куча мишуры, которая работает отдельно от твоего кода.

То есть, всякая мишура на которую ты не можешь повлиять, они будут всегда, самое страшное что ты можешь сделать — их отключить (и то не факт). И всё.
setTimeout в js вроде со времён динозавров ещё.
источник

S

Snusmumriken in pro.lua
Ну ды, и с тех пор оно мне не нравится, потому что я оказываюсь на позиции мартышки, которой выдали песочницу и совочек без контроля происходящего : )
С другой стороны, именно в браузерном ЖС это оправдано. Система-то уже есть, и используется ещё для много чего, чому бы не заюзать для этого. А управлять рантаймом вручную — многие жс-кодеры сломаются.
источник

AZ

Aydar Zarifullin in pro.lua
Snusmumriken
Ну ды, и с тех пор оно мне не нравится, потому что я оказываюсь на позиции мартышки, которой выдали песочницу и совочек без контроля происходящего : )
С другой стороны, именно в браузерном ЖС это оправдано. Система-то уже есть, и используется ещё для много чего, чому бы не заюзать для этого. А управлять рантаймом вручную — многие жс-кодеры сломаются.
Хочешь контроля пиши на асме
источник

S

Snusmumriken in pro.lua
Достаточно не писать в браузерном ЖС.
источник

S

Snusmumriken in pro.lua
Даже луям можно написать сишно-асмовые либы : )
источник