Alex
встречали такое хоть раз?
🌗
если речь о массиве, то проще узнать его размер через table.getn и не дублировать "tab["n"] = tab["n"] +- 1" там, где нужно добавлять/удалять элементы из массива
🌗
если о таблице, то придется использовать цикл и там считать количество элементов
Alex
Не понимаю как можно различать списки от массивов, если все они таблицы в lua. Они же по факту могут являться кортежами и множествами, и в любом случае придется озвучивать принцип индексации и сортировки, потому что по одному названию ничего не понятно
Alex
А в умной книжке еще вот что пишут: Этот подход работает только со списками, в которых нет дыр, которые содержат значение nil. Мы называем подобные списки последовательностями (sequence).
Alex
Кого интересно автор подразумевает под "мы"
🌗
Не понимаю как можно различать списки от массивов, если все они таблицы в lua. Они же по факту могут являться кортежами и множествами, и в любом случае придется озвучивать принцип индексации и сортировки, потому что по одному названию ничего не понятно
корректнее будет ассоциативный массив или таблица, а не список таблица = пара ключ-значение, где ключ может быть не только числом, но и строкой массив = индекс-значение насчет принципа индексации и сортировки не совсем понял
🌗
массив индексирует сам lua, а таблица не гарантирует порядок элементов
Alex
В разделе про управляющие конструкции забавно: Если вы хотите получить цикл без верхнего предела, то вы можете использовать константу math.huge
Alex
А этот math.huge принтует "inf", infinity, типа бесконечное число
Alex
Очень креативненько
Alex
Интересно, что там под капотом в этом math.huge. Это нужно сорсы на си посмотреть видимо?
Alex
По области видимости: Хорошим стилем является использование локальных переменных везде, где только это возможно. Локальные переменные помогают вам избежать забивания глобального окружения ненужными именами. Более того, доступ к локальной переменной быстрее, чем доступ к глобальной. И наконец, локальная переменная перестает существовать, как только заканчивается ее область действия, позволяя сборщику мусора освободить память, занимаемую ее значением.
Alex
про разную скорость доступа не понятно - как так
Alex
и еще не понимаю зачем на нулевом уровне все стараются функции и переменные локалить, ведь ее область действия закончится только с завершением всей программы, получается смысла нету в этом
🌗
про разную скорость доступа не понятно - как так
как насчет погуглить? https://stackoverflow.com/a/9141519
Денис
когда ключ нужно в квадратные скобки оборачивать и когда нужно еще и кавычки?
В Lua у таблиц есть свои фишки. Если мы объявляем ключ типа строка с ручным присваиванием значения, мы можем вообще квадратные скобки с кавычками упускать local person = { firstname = "foo", lastname = "bar" } Это синтаксический сахар. Такой ключ предполагает, что он - строка. а вот если мы захотим присвоить в качестве ключа какой-то тип, то квадратные скобки писать придется local states = { [false] = "disabled", [true] = "enabled" } Кавычки же обозначают тип строка (равно как и блок [[]] ), так что если мы ставим кавычки, мы сразу же уходим из синтаксического сахара, говоря интерпретатору, что дальше пойдут данные типа string. И если мы необернем это все добро в квадратные скобки ( [] ), то получим синтаксическую ошибку. Суммируя: записи типа local person = { firstname = "foo", lastname = "bar" } и local person = { ["firstname"] = "foo", ["lastname"] = "bar" } эквивалентны. Первый вариант - это синтаксический сахар, второй - верное написание кода во всех случаях. Стоит сразу заметить, что если мы берем за основу ключа что-то извне, квадратные скобки полюбому ставить придется. local stateOne = false local stateTwo = true local states = { [stateOne] = "disabled", [stateTwo] = "enabled" } — Проверяем print(states[stateOne]) > disabled states = { stateOne = "disabled", stateTwo = "enabled" } — проверяем print(states[stateOne]) > nil print(states["stateTwo"]) > enabled — потому что второе присваивание было принято интерпретатором как использование синтаксического сахара и теперь в нашей таблице находятся не значения из двух переменных выше, а ключи строк "stateOne" и "stateTwo". Вообще, ключи таблиц в виде строки у Lua весьма засахаренные. Их можно индексировать через точку, их можно не оборачивать в тип при инициализации таблиц... В общем, крутяк.
Денис
Я тут недавно ковырял один опенсурцный синт, работающий по VST, где на борту можно использовать Lua для создания LFO. там во всех туториальных патчах были инициализации типа modstate["notes"] = { 0, 4, 5, 7, 5, 10, 5, -2, -5 } Ну и потом обращения к ним были типа modstate["output"] = modstate["notes"][modstate["current_note"]] / 12 + modstate["tuneadj"] Пишу разработчикам в дискорде, мол, а нафига? Можно же записывать типа modstate.notes = { 0, 4, 5, 7, 5, 10, 5, -2, -5 } и modstate.output = modstate.notes[modstate.current_note] / 12 + modstate.tuneadj ``` соответственно. Разработчик искренне удивился, что так можно было. Ну, а я удивился, что он этого не знал. Ну да, так с точки зрения табличной парадигмы наверно даже правильнее, но путает такой код весьма.
Денис
[] наверно лучше применять где перебор значений в таблице. Например: for i = 1, #modstate.notes do print(modstate.notes[i]) end
Не, там просто перебрать не вариант. Там две функции: первая инициализирует вводные данные, а вторая вызывается каждый семпл модуляции LFO. Я себе там написал темплейт секвенсора, и он там отталкивается от каждого значения амплитуды.
Alex
Прошу помощи по строкам, после питона с ними совсем тяжко идет... Можно как то повторить символ внутри принта определенное количество раз или это нужно сначало циклом из собирать? print(" "*7) хочу семь пробелов
Igor
или string.rep(" ", 7), тут уже как больше нравится
Snusmumriken
function rpad(str, char, n) return str .. char:rep(n - #str) end
Alex
str это не зарезервированное слово в lua?
Alex
local function tprint(t) local function indentCount(key) local indent = 20 - #tostring(key) if indent < 1 then return " " else return string.rep(" ", indent) end end for key, value in pairs(t) do print(key .. indentCount(key) .. value) end end tprint(arr)
Snusmumriken
Сделай обычный lpad и rpad.
Alex
local arr = {["Один111111"] = 234234, ["Два"] = "sdfsdf werwr", ["Три33"] = 333333, ["Четыре"] = "Четыре"}
Alex
почему не выравнивает???
🌗
в смысле не выравнивает
🌗
в случайном порядке печатает в консоль?
Alex
значения должны ровненько выравниваться по вертикальной линии
Alex
Сделай обычный lpad и rpad.
это в каком модуле? в string не вижу такого
Snusmumriken
это в каком модуле? в string не вижу такого
> сделай Сделай значит сделай руками )) function lpad(str, char, n) return char:rep(n - #str) .. str end function rpad(str, char, n) return str .. char:rep(n - #str) end
Snusmumriken
Смотри.
Snusmumriken
А, не тому ответил, @alex93skr.
Snusmumriken
local arr = {["Один111111"] = 234234, ["Два"] = "sdfsdf werwr", ["Три33"] = 333333, ["Четыре"] = "Четыре"}
Кстати, напоминаю. UTF8 это UTF8. У тебя русские буквочки уползают влево, и чем больше там буквочек, кстати, тем сильнее они будут уползать.
Snusmumriken
А то.
Alex
жесть
Snusmumriken
Луа не имеет понятия ни о каких кодировках. И это прекрасно.
Snusmumriken
Но есть решение ))
Snusmumriken
Я как раз чуть больше недели назад запилил вот это счастье для всех страждущих: https://github.com/HDPLocust/snus_stuff/blob/main/snus_string.md https://github.com/HDPLocust/snus_stuff/blob/main/snus_string.lua Копируй, юзай.
🌗
видимо поэтому у меня всё норм, а у него нет
🌗
с cp1251 все отрабатывает как надо
Snusmumriken
cp1251 это однобайтовая кодировка, ещё бы не отрабатывало как надо. Разве что паттерны не работают на русские буквочки, пока ты вручную не определишь классы как [а-яА-Я].
Snusmumriken
Но utf8 это то с чем мы все сейчас в основном живём в нашем широком многонациональном мире, поэтому см. snus_string.
Alex
С кодировкой это очень неожиданный поворот, ни в жизни бы не догадался. Но как оказалось, в консоли факторки еще и шрифт не моноширинный, так что задача уходит чисто в практику
Alex
Snusmumriken
Это обычный поворот, особенно если ты работаешь с текстом, или хотя бы начинал со второго питона.
Snusmumriken
Так что катай обычную ерунду. "ключ: значение". Красивое выравнивание отменятся.
Aydar
Так что катай обычную ерунду. "ключ: значение". Красивое выравнивание отменятся.
Выравнивание пробелами отменяется, а так там наверняка есть свой getStringWidth с помощью которого можно ровно отрисовать (если там можно рисовать и это не хардкоженная менюшка)
Snusmumriken
Скорее всего это отладка факторио, это раз. Два — выравнивать в пикселях такое себе.
GLOOM {Читайте БИО}
Кто знает где можно учить lua
Igor
В книжках
Igor
Впрочем, как и любой другой ЯП
GLOOM {Читайте БИО}
В книжках
Вот какие лучше для новичка
Igor
Вот какие лучше для новичка
Почитай закрепы этого чата и ты всё найдешь
GLOOM {Читайте БИО}
Ок
Igor
Там и ссылки на PiL есть бесплатные и всё остальное
Aqendo
Там и ссылки на PiL есть бесплатные и всё остальное
и ссылка на книгу иерусалимски со 100% скидкой
Igor
))))))
Igor
*Иерусалимского
Тогда уж вообще Иерузалимски
Igor
Нет.
Roberto Ierusalimschy (ʁoˈbɛʁtu jeɾuzaˈlĩski)
fgntfg
Snusmumriken
Спайдеру Иерусалимску
Luсky
Roberto Ierusalimschy (ʁoˈbɛʁtu jeɾuzaˈlĩski)
Ага. Иерусалимский.
Артем
Всем привет! Подскажите, пожалуйста. local t = {"unix":"5", "windows" : "foo", "apple" : "88", "microsoft" : "bar", "google" : "-5", "awk" : "baz", "c++" : "a"} Хочу отсортировать ключи по алфавиту: local key_list = {} for key, _ in pairs(t) do table.insert(key_list, tostring(key)) end table.sort(key_list) local info = {} for _, v in pairs(key_list) do info[v] = t[v] end Получаю: {'c++': 'a', 'windows': 'foo', 'awk': 'baz', 'google': '-5', 'apple': '88', 'microsoft': 'bar', 'unix': '5'}