mva
Алсо, почему у меня на lua5.1-4 _G._LOADED == nil?
а почему должно быть иначе?
Snusmumriken
Wsevolod
а почему должно быть иначе?
Потому что > it keeps a table with the names of all loaded files > You can access this control table through the global variable _LOADED
Wsevolod
src: https://www.lua.org/pil/8.1.html
Roy
Привет, подскажите еще раз, как мне проитерироваться по таблице в луа CI.Players[PID] - вот такая таблица есть, надо пройтись по всем Players
Roy
Причем надо проитерироваться именно по существующим таблицам, nil'ы игнорить
fgntfg
for pairs next()
fgntfg
ipairs на первой дырке остановится
fgntfg
Если я не путаю
Snusmumriken
Остановится.
Snusmumriken
И PID подразумевает что тут отсутствует и 1 и 2 и 3 и так далее, то есть крайне высока вероятность что "массив" начинается с дырки.
fgntfg
Если процесс завершился то будут
fgntfg
Если это process ID
fgntfg
А так, зависит от логики приложения
Snusmumriken
Это не process id а player id. И вот он хз какой, и да, зависит от логики приложений.
Snusmumriken
Привет Emir, чем интересуешься?
Иван
Привет Emir, чем интересуешься?
Видимо, всему по чуть чуть
Snusmumriken
Или он робот, который лазает по ссылкам в группах.
Snusmumriken
Даже в lua in moscow влез
Roy
for i,v in ipairs(table) do
что лежит в value? value - копируемый объект или ссылка на объект из таблицы?
Roy
еще один вопрос, если постоянно обращаться к объекту из таблицы используя такой синтаксис: CI.Players[PID].var1 = 10 CI.Players[PID].var2 = 20 CI.Players[PID].var3 = 30 то это затратнее в плане производительности или нет? Чем вот такой local player = CI.Players[PID] player.var1 = 10 player.var2 = 20 player.var3 = 30
Roy
Разве в первом случае не будет выполняться постоянный поиск в таблице?
Tony
Документация есть
Tony
И по pairs, и по ipairs
Highly Likely
Roy
Да :)
А че там под капотом у луа? хеш таблица для таблиц?
Highly Likely
Но на твоих объемах я думаю можно не париться
Highly Likely
Highly Likely
И в доках
mva
Инфа сотка?
берёшь luac -l и проверяшь.
Highly Likely
Или так :)
Roy
У меня котопес, LuaJIT в С++
Roy
Отдельно короче не работает, гейм сервер юзает луа скрипты для игры через LuaJIT
Roy
luajit -bl
а ты похоже давно в луа
mva
ну, где-то между 10 и 15 годами
fgntfg
Нет, но у нас не один скрипт
Как-то давным давно в этом чате измеряли как быстрее. Разница начинала быть хоть сколько нибудь значимой далеко за миллион итераций.
Roy
Я вот щас почитал немного про оптимизации луа, сказано, что локализовать надо по возможности все что лежит в глобальном пространстве
Roy
потому что глобальные функции и объекты ищутся через хеш таблицу
Roy
а локальные по индексу
Roy
это так?
fgntfg
Вот так
fgntfg
Есть, на самом деле, супер глобальная таблица _G, в которой все лежит
fgntfg
И чтоб к ней не обращаться каждый раз используют local
fgntfg
Таблица, по сути, хеш-велью хранилище. И чем оно больше, тем дольше у тебя данные из него доставать. Но тут @mva_name или @Snusmumriken меня поправят, если я не прав.
Roy
Я правильно понял, что если в таблице не обнулять ключ, то сборщик мусора не освободит этот объект (пару) из таблицы
Roy
Если таблица глобальная
fgntfg
За сборщик не подскажу. Я на lua сто лет не писал. Для верности можно и в ключ и в значение бахнуть null. Но оптимизячить надо живой код, я считаю
Roy
https://onecompiler.com/lua/3xew8axfk
Roy
Вот допустим есть такой код, почему в луа не завезли способ, который позволял бы избежать двойного обращения по ключу и тем более wtf постоянно копируется?
Roy
Я вот теста ради написал чтоб узнать будет ли wtf ссылкой на объект или будет копией, оказалось что копия. Если закомментировать 12 строку, то вывод не изменится
Roy
Не могу понять, луа в доках утверждает что копий нет, все это ссылки, но при этом мы видим что local wtf при изменении не влияет на элемент таблицы
R
Конкретно LuaJIT подвыражения оптимизирует очень хорошо, ванилька не умеет. Но в любом случае достоверный ответ даст только тестирование.
Roy
wtf = "55" "ребиндит ссылку", а не меняет значение wtf.
аа, то есть, пытаясь изменить якобы объект я сам того не зная создаю копию ?
mva
это просто создание другой переменной с тем же именем, которое "затеняет" видимость глобальной переменной (которая остаётся на месте)
Александр
аа, то есть, пытаясь изменить якобы объект я сам того не зная создаю копию ?
да. гипотетический метод wtf:set("123") менял бы wtf, но строки в луа иммутабельны
Roy
Так что мне делать? Я не вижу смысла почему я должен дважды искать в хеш таблице один и тот же объект если я хочу одновременно прочитать его, а потом изменить
Roy
особенно если объекты тяжелые
Roy
"одновременно прочитать его, а потом изменить" это как?
Ну типа сначала прочитать какие то данные, а потом уже изменить саму таблицу Разные случаи бывают
mva
в любом случае - у тебя есть метатаблицы, с их помощью ты можешь модифицировать табличный класс, прикрутив к таблицам батарейки для превращения их в полноценный (насколько это возможно) объект
mva
соответственно, можешь даже сделать table:copyvalue(index,where_to_put_copy):changevalue(index,what_to_put)
Roy
без конкретных объяснений это выглядит как проблема XY
function change_name(id, new_name) local old_name = PlayersName[id] print("User: " .. id .. " change name from: " .. old_name .. " to: " .. new_name) PlayersName[id] = new_name; end
Roy
Ну вот к примеру
Roy
Задача аля поменять ник игрока, но при этом вывести инфу с какого ника на какой поменяли (задачу с воздуха взял)
mva
ну и в чём проблема?