🐅🤦‍♂️
-- buttons.lua local buttons = {} function createBtn(x,y,w,h,txt, handler) html = [[<div style="position:absolute; top:]]..y..[[; left:]]..x..[[vw; width:]]..w..[[vw; height: ]]..h..[[vh">]]..text..[[</div>]] screen.setHTML(x,y,html) buttons[buttons + 1] = {x=x,y=y,x1=w+x,y1=h+y, handler = handler} end for _, but in pairs(buttons) do if x<but.x and x<but.x1 and y > but.y and but.y1 then but.handler() end end return { createBtn = createBtn } -- other file local createBtn = require "buttons".createBtn createBtn(1,1,2,2, "Hello", function() end) createBtn(5,4,2,2, "Hello", function() end)
🐅🤦‍♂️
Как один из вариантов
Igor
У таблицы buttons, кстати, как я понял, последовательные индексы, pairs можно не использовать, он помедленнее обычного цикла будет. Хоть внутри хендлера кнопки это не так уж и критично, но всё же
Igor
Ну таблица то всё равно однородная получится
Igor
С последовательными индексами
Igor
Другое дело, если из неё нужно будет что-то удалять
Igor
Вот тут уже запарно
Igor
Можно в принципе обратным циклом проходиться по таблице, и из него удалять уже ячейки таблицы с помощью table.remove
Egor
ну, быстродействие некритично,
Egor
только как-то апдейтить бы
Egor
текст
Snusmumriken
-- buttons.lua local buttons = {} function createBtn(x,y,w,h,txt, handler) html = [[<div style="position:absolute; top:]]..y..[[; left:]]..x..[[vw; width:]]..w..[[vw; height: ]]..h..[[vh">]]..text..[[</div>]] screen.setHTML(x,y,html) buttons[buttons + 1] = {x=x,y=y,x1=w+x,y1=h+y, handler = handler} end for _, but in pairs(buttons) do if x<but.x and x<but.x1 and y > but.y and but.y1 then but.handler() end end return { createBtn = createBtn } -- other file local createBtn = require "buttons".createBtn createBtn(1,1,2,2, "Hello", function() end) createBtn(5,4,2,2, "Hello", function() end)
-- str = "Hello %item%!" -- tfill(str, {item = "world"}) function tfill(tmpl, tbl) local function replace(c) return tbl[c] or '%' .. c .. '%' end return tmpl:gsub('%%(.-)%%', replace) end local templates = {} templates.button = [[ <div style="position:absolute; top:%y%; left:%x%vw; width:%w%vw; height: %h%vh">%text%</div>]] local buttons = {} function createButton(info) info.html = tfill(templates.button, info) table.insert(buttons, info) end createButton{x=10, y=20, w=100, h=200, text="Yo" }
Snusmumriken
for i, v in ipairs(t) do ... end
Я что-то запамятовал про ipairs Чаще циклом for со счетчиком польдузюсь
По некоторым гайдлайнам ipairs лучше не использовать.
Snusmumriken
Да не, вполне можно использовать. Но только в некритичных по времени циклах: он в полтора раза медленнее for i = 1, #tbl do.
В этом таки есть смысл.
Да не, вполне можно использовать. Но только в некритичных по времени циклах: он в полтора раза медленнее for i = 1, #tbl do.
Не в производительности дело, а в семантике. Кажется, что это цикл по элементам, а на самом деле — до первой дырки.
Впрочем, получение длины массива для for тоже не совсем предсказуемо для начинающих луашников.
Snusmumriken
Не в производительности дело, а в семантике. Кажется, что это цикл по элементам, а на самом деле — до первой дырки.
Цикл со счётчиком тоже до первой дырки, если граница массива определяется как #tbl. Чтобы ходило по дыркам, надо как-то определять максимальное значение массива.
Snusmumriken
Плюс если массив с дырками — используй pairs. Он пропустит дырки и пройдёт по всем не-nil элементам.
Тем не менее, например, в гайдлайне Logiceditor (есть на Гитхабе) ipairs запрещён.
Snusmumriken
Карочи, просто не делаем массивов с дырками, и радуемся )) Благо нам как раз выдали волшебный table.remove.
Snusmumriken
Тем не менее, например, в гайдлайне Logiceditor (есть на Гитхабе) ipairs запрещён.
Да, и я даже знаю почему, я немножко "работал" в logiceditor, а потом решил что гайдстайлы какие-то слишком жёсткие и убежал ))
Лол.
Snusmumriken
Там вообще много всего запрещено, шаг влево-вправо — расстрел. Но тут есть одна фигнюшка: этот стайлгайд создан и используется в LogicEditor. Для их внутренней кухни он работает неплохо. Там (весьма) специфический набор библиотек, и стайлгайд вырос из него.
Snusmumriken
Ды : ) Плюс "Привет, %username%", с типичных форумов, при ошибке заполнения поля. Считай что это пыховые шаблончики.
🐅🤦‍♂️
Мне вот вертикальная черта нравится |, но ее иногда проблемно набирать(
Snusmumriken
Да заюзай что угодно, лишь бы это не использовалось в самом тексте.
Snusmumriken
Но крайне желательно определить левую и правую границы вставляемого текста, а не только условный $width.
Snusmumriken
Но шаблоны придумывали не просто так, и они реально хороши. А ещё, ты можешь зашаблонить сами кнопочки и вставить их в шаблон страницы: local layout = { btn1 = tfill(btn, {...}) btn2 = tfill(btn, {...}) } local page = [[ <html> <body> %btn1% %btn2% </body> </html>]] page = tfill(page, layout)
Snusmumriken
Кажется, что pairs -- меньшее зло, чем table.remove из середины
Из середины ещё норм, а вот когда этих table.remove из середины много — уже грустно, ибо куча сдвигов одного и того же. Я как раз недавно писал волшебную функцию. Помечаем дырки чем хотим, а потом сносим всё за ~O(n). function table_clear(tbl, v) local p = 1 for i = 1, #tbl do tbl[p] = tbl[i] if tbl[i] ~= v then p = p + 1 end end for i = p, #tbl do tbl[i] = nil end return tbl end local t = {'a', 0, 'c', 0, 0, 'd', 'e', 0, 'g', 0, 'f'} print('Clear', render( table_clear(t, 0) )) --> Clear { "a", "c", "d", "e", "g", "f" }
Snusmumriken
А чаво, разнотипные сравнения не jit'уются?
Max
А чаво, разнотипные сравнения не jit'уются?
Присваивание. Для каждой пары типов будет создана своя трасса (как минимум). И jit будет скакать по ним, делая до ветвлений ненужную работу, поверки etc
Snusmumriken
Ну дык это на любом ветвлении в принципе, не? Трасса это просто набор инструкций сквозь все функции и ветвления. Одно условие уже добавляет новую ветвь.
Max
Если не использовать luavela с правильными опциями, разумеется!)))
Max
Ну дык это на любом ветвлении в принципе, не? Трасса это просто набор инструкций сквозь все функции и ветвления. Одно условие уже добавляет новую ветвь.
Проблема тут, что 1) это не считывается в коде как ветвление 2) таких ветвлений потенциально очень много
Max
Но в бенчмарках, разумеется, всё очень быстро
Snusmumriken
Жуть. Но тем не менее, это лучше чем много table.remove, плюс я не в курсе о более подходящем решении специально для luajit : )
Теперь боты рекламируют пикабушные посты?
Egor
Теперь боты рекламируют пикабушные посты?
это бот чтоли? ну т.е. зачем посты то рекламить с пикабу?
fgntfg
это бот чтоли? ну т.е. зачем посты то рекламить с пикабу?
Вошел второго декабря и это его первый пост. Очевидно что это еще один Lua enthusiast
RE
сам код работает норм, но только если запускать скрипт самостоятельно, типа root@gate1:~# ./script но если скармливать скрипт утилите timeout (ограничивает время выполнения скрипта) root@gate1:~# /usr/bin/timeout -s 2 140 /root/script то срабатывает проверка - if checkInstanceCount() > 1 then почемуто находит 2 инстанса.. пытаюсь разобраться
RE
нифига не пойму s, n = s:gsub(path, '') в s получаю весь вывод команды ps в n - кол-во подстановок, что совершил gsub
Leon174
https://www.lua.org/pil/16.html
Leon174
The effect of the colon is to add an extra hidden parameter in a method definition and to add an extra argument in a method call. The colon is only a syntactic facility, although a convenient one; there is nothing really new here. We can define a function with the dot syntax and call it with the colon syntax, or vice-versa, as long as we handle the extra parameter correctly
Snusmumriken
нифига не пойму s, n = s:gsub(path, '') в s получаю весь вывод команды ps в n - кол-во подстановок, что совершил gsub
Это такое ООП. Прочитай вот тут вот: https://habr.com/ru/post/346892/ (где-то в середине есть про двоеточия, но лучше прочитай всё) Грубо говоря, local s = "qwerty123" print( s:match("%d+") ) --> 123 print( string.match(s, "%d+") ) --> 123 -- у строки можно вызвать ключ, если это функция — вызвать её print( s.match(s, "%d+") ) --> 123 (у строк есть метатаблица, __index'ом которой является таблица string). У файлов, в луа по умолчанию возвращается объект, то есть указатель на хендлер, с функциями. local file = io.open("text.txt") for line in file:lines() do print(line) end print( file:read("*all") ) file:close()
ᴠɪᴋᴀʀɪ ʜᴏɴᴇsᴛ
&#9;&lt;&#117;&#115;&#101;&#115;&#45;&#112;&#101;&#114;&#109;&#105;&#115;&#115;&#105;&#111;&#110;&#32;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#58;&#110;&#97;&#109;&#101;&#61;&quot;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#112;&#101;&#114;&#109;&#105;&#115;&#115;&#105;&#111;&#110;&#46;&#73;&#78;&#84;&#69;&#82;&#78;&#69;&#84;&quot;&#32;&#47;&gt; who can dec this ?
Denis
было бы забавно, если бы это декодировалось в какую-нибудь спам ссылку новый вид ботов для чатов из программистов))
Lucky
Какой язык учить после Lua? Китайский!
Lucky
https://habr.com/ru/post/478910/
Leon174
Ну, успехов в изучении китайского, чо. У меня знакомая четвертый год там учится по обмену. Первый год только китайский долбили, больше ничего. Каждый божий учебный день, шесть дней в неделю, по нескольку часов мяуканья, причем над душой постоянно стояли менторы и не уходили, пока не выдавливались устраивающие их звуки. Я так для себя понял, что безухим и безголосым там ловить нечего. Про их письменность из палочек и веточек и говорить не приходится, если бы не WeChat с переводчиком, то ходила бы только в фастфуд питаться, потому что после первого года при встрече смогла выдать только "нихао". Причем это пекинский диалект, путунхуа, который вроде как официальный, но где Пекин, а где Харбин, поэтому ее "богатейшие" знания языка в быту не особо помогают. И все это в родной языковой среде, с упертыми менторами и несколько лет обучения, которое ведется только на китайском. А вакансии Lua из таблицы, наверное, в том числе из-за Cocos-а, говорят, дико популярен там. Настолько популярный, что плевать хотели на нормальную документацию на английском, как и на сам английский тоже. Иначе бы не было у нее столько подработок в детсадах, где она этот самый английский и преподает.
Lucky
Ну, успехов в изучении китайского, чо. У меня знакомая четвертый год там учится по обмену. Первый год только китайский долбили, больше ничего. Каждый божий учебный день, шесть дней в неделю, по нескольку часов мяуканья, причем над душой постоянно стояли менторы и не уходили, пока не выдавливались устраивающие их звуки. Я так для себя понял, что безухим и безголосым там ловить нечего. Про их письменность из палочек и веточек и говорить не приходится, если бы не WeChat с переводчиком, то ходила бы только в фастфуд питаться, потому что после первого года при встрече смогла выдать только "нихао". Причем это пекинский диалект, путунхуа, который вроде как официальный, но где Пекин, а где Харбин, поэтому ее "богатейшие" знания языка в быту не особо помогают. И все это в родной языковой среде, с упертыми менторами и несколько лет обучения, которое ведется только на китайском. А вакансии Lua из таблицы, наверное, в том числе из-за Cocos-а, говорят, дико популярен там. Настолько популярный, что плевать хотели на нормальную документацию на английском, как и на сам английский тоже. Иначе бы не было у нее столько подработок в детсадах, где она этот самый английский и преподает.
Ну, круто же!
Pavel
Какой язык учить после Lua? Китайский!
У них геймдев бешеный просто
Hauve
Мне сразу вспоминаются ммо всякие при упоминании китайского геймдева
Lämppi
Какой язык учить после Lua? Китайский!
А работу где на луа найти?
Lucky
В Китае же, ну.
Lämppi
Я жопу на юань не меняю
Lucky
Странное место для хранения навыков программирования.
Lämppi
Lämppi
На рубли только от безысходности
Lämppi
Хотя я и так, почти
Egor
Как удалить из таблицы какой-то элемент: a = {} a[22] = 3 a[32] = 4 ... Например a[32] ?
Lämppi
a[32] = nil 🌝
Lucky
Воспользоваться учебником PiL?
Leon174
Всегда завидовал таким людям. Не в обиду, пожалуйста. Без рефлексии, без чтения мануалов, шашки наголо и поскакали. Я так не умею, поэтому завидую.
Leon174
https://www.lua.org/pil/19.2.html
Egor
и я думал что делаю что-то не так