Alex
встречали такое хоть раз?
🌗
🌗
если речь о массиве, то проще узнать его размер через table.getn и не дублировать "tab["n"] = tab["n"] +- 1" там, где нужно добавлять/удалять элементы из массива
🌗
если о таблице, то придется использовать цикл и там считать количество элементов
Alex
Не понимаю как можно различать списки от массивов, если все они таблицы в lua. Они же по факту могут являться кортежами и множествами, и в любом случае придется озвучивать принцип индексации и сортировки, потому что по одному названию ничего не понятно
Alex
А в умной книжке еще вот что пишут: Этот подход работает только со списками, в которых нет дыр, которые содержат значение nil. Мы называем подобные списки последовательностями (sequence).
Alex
Кого интересно автор подразумевает под "мы"
🌗
🌗
массив индексирует сам lua, а таблица не гарантирует порядок элементов
🌗
Alex
В разделе про управляющие конструкции забавно: Если вы хотите получить цикл без верхнего предела, то вы можете использовать константу math.huge
Alex
А этот math.huge принтует "inf", infinity, типа бесконечное число
Alex
Очень креативненько
Alex
Интересно, что там под капотом в этом math.huge. Это нужно сорсы на си посмотреть видимо?
🌗
Alex
По области видимости: Хорошим стилем является использование локальных переменных везде, где только это возможно. Локальные переменные помогают вам избежать забивания глобального окружения ненужными именами. Более того, доступ к локальной переменной быстрее, чем доступ к глобальной. И наконец, локальная переменная перестает существовать, как только заканчивается ее область действия, позволяя сборщику мусора освободить память, занимаемую ее значением.
Alex
про разную скорость доступа не понятно - как так
Alex
и еще не понимаю зачем на нулевом уровне все стараются функции и переменные локалить, ведь ее область действия закончится только с завершением всей программы, получается смысла нету в этом
Snusmumriken
Денис
когда ключ нужно в квадратные скобки оборачивать и когда нужно еще и кавычки?
В 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
```
соответственно. Разработчик искренне удивился, что так можно было. Ну, а я удивился, что он этого не знал. Ну да, так с точки зрения табличной парадигмы наверно даже правильнее, но путает такой код весьма.
Hello, World! 🎄
Я тут недавно ковырял один опенсурцный синт, работающий по 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
Alex
Прошу помощи по строкам, после питона с ними совсем тяжко идет... Можно как то повторить символ внутри принта определенное количество раз или это нужно сначало циклом из собирать? print(" "*7) хочу семь пробелов
Igor
Igor
или string.rep(" ", 7), тут уже как больше нравится
Snusmumriken
function rpad(str, char, n)
return str .. char:rep(n - #str)
end
Alex
str это не зарезервированное слово в lua?
Igor
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
значения должны ровненько выравниваться по вертикальной линии
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.
Alex
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
Так что катай обычную ерунду. "ключ: значение". Красивое выравнивание отменятся.
Snusmumriken
Скорее всего это отладка факторио, это раз.
Два — выравнивать в пикселях такое себе.
usernameak
GLOOM {Читайте БИО}
Кто знает где можно учить lua
Igor
Igor
В книжках
Igor
Впрочем, как и любой другой ЯП
GLOOM {Читайте БИО}
В книжках
Вот какие лучше для новичка
Igor
GLOOM {Читайте БИО}
Ок
Igor
Там и ссылки на PiL есть бесплатные и всё остальное
Aqendo
Igor
))))))
Luсky
Luсky
Igor
Нет.
Roberto Ierusalimschy (ʁoˈbɛʁtu jeɾuzaˈlĩski)
fgntfg
Snusmumriken
Спайдеру Иерусалимску
Luсky
Артем
Всем привет!
Подскажите, пожалуйста.
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'}