Snusmumriken
Нет
Snusmumriken
А
Snusmumriken
Стоп
Snusmumriken
Понимаешь что ты вообще сделал? ))
Ruslan
да, в таблицу добавил ключ area с значение 123 а моя желанная функция осталось в мета не тронутой
Snusmumriken
Как работает __index?
Snusmumriken
Для чего он вообще нужен?
Ruslan
при обращении по ключу или индексу - хукается туда
Ruslan
если нужно его поведение изменить то велком как говорится
Snusmumriken
Это фолбек для ключей. Если запрошенного ключа нет в оригинальной таблице, смотрит по __index'у. Ты добавил ключ совпадающий с метатабличной фигнёй. Всё, теперь удаляй чтобы иметь доступ к функции.
Ruslan
можно перенаправить, подусуть другую таблицу
Snusmumriken
То что так гипотетически можно сделать не значит что это нужно делать. Андестенд? Хотя появляется простор для манки-патчей.
Snusmumriken
А зачем тогда делал? ))
Snusmumriken
getmetatable(o).__index.area — вот так можно, но нахера было изначально затенять имя метода?
Ruslan
фолбек - понял, хотел написать что если не найдено но чутка засомневался)))
Ruslan
getmetatable(o).__index.area — вот так можно, но нахера было изначально затенять имя метода?
это я тестирую особенности кода, чтобы лучше понимать его поведение и нюансы
Snusmumriken
Хорошо, в общем ты надеюсь понял ))
Ruslan
выше проведённый тест лишь говорит что если заведомо известно что в таблицу попадет чтото что может затенить - ....алерт!)) и метатаблица не панацея для ограждения
Snusmumriken
Так вот. Как сделать множественное наследование: local Class1 = {a = 10} local Class2 = {a = 20, b = 30} local child = setmetatable({}, { __index = function(self, key) return Class1[key] ~= nil and Class1[key] or Class2[key] end }) print( child.a ) --> 10 print( child.b ) --> 30 Class1 и Class2 могут обладать своими метатабличками с __index'ом.
Snusmumriken
Но функции в __index'е значительно медленнее, поэтому не советую их использовать просто так, на нагруженной фигне.
Ruslan
я пришел к выводу что луше просто взаимодействовать через свой описаный интерфейс типа x:index(1) или key('qwert') push pop insert append и лишь когда нужна родная таблица то например get_table() )))) не взаимодействовать на прямую
Ruslan
ну и про __pairs не забыть
Snusmumriken
Это если прям очень надо накакать и всё защитить от дуболомов. Но замедление и в общем-то бессмысленная ерунда.
Ruslan
Это если прям очень надо накакать и всё защитить от дуболомов. Но замедление и в общем-то бессмысленная ерунда.
Понял, благодарю за пример и за предупреждение о скорости фукнций в индексе.
Snusmumriken
Обычно лучше использовать интерфейсы, безусловно.
Ruslan
Поделитесь списком масхевных/ходовых пакетов по вашему мнению
Ruslan
Для себя открыл пакет inspect.lua https://github.com/kikito/inspect.lua
Snusmumriken
Для себя открыл пакет inspect.lua https://github.com/kikito/inspect.lua
Ну собственно он и есть. В общем-то всё.
Igor
Для разных задач и мастхэвы разные
Snusmumriken
Вот-вот. У меня как мастхев идёт луасокет и куча моих батареек а ля моя class-либа.
Snusmumriken
Вот это ооп в сотне строчек. https://pastebin.com/K1yRyE1T
Ruslan
Вот-вот. У меня как мастхев идёт луасокет и куча моих батареек а ля моя class-либа.
Прикольно, выражение батарейки в данном контексте еще не слышал)))
Snusmumriken
Ну например чот такое: https://pastebin.com/ZvejNYr3 https://pastebin.com/G8nvJ0Bi
Ruslan
Вот это ооп в сотне строчек. https://pastebin.com/K1yRyE1T
Там же без функций в индексе?))
Snusmumriken
Разумеется, там вообще всё предельно тупо и быстро
Ruslan
*просто с телефона щас
Snusmumriken
Ну первое для работы с табличками, а ля набор итераторов и типа-функциональщины map-filter, довольно быстрой и оптимизированной.
Snusmumriken
filter это вообще весьма прикольная и оптимизированная штука для удаления элементов из массива с парой курсоров "что проверяем" и "куда вставляем если оно норм".
Ruslan
Фильтр и в питоне есть, если не истина то итерация пропускается
Snusmumriken
Фильтр тут — буквально фильтрует массив, но делает это на месте, буквально чистит его от чего либо. Если нужна копия — делаем копию и фильтруем её, ибо нефиг плодить копии на пустом месте. Второе — строчечки и работа с ними, конвертация в 1251 для венды и обратно (сворованная), кодирование в url и обратно, итераторы по utf8-символам, сплиты, слайсы, тримы и всякое такое.
Ruslan
Полезные штуки) , благодарю
Snusmumriken
Вот тут ещё можно прилично наворовать. Пакет в целом хорош, основная часть требует luajit/ffi, но есть утилити вроде glue, которые на чистых луях пашут https://luapower.com/
Ruslan
https://luarocks.org/stats/this-week
Слышал еще какаято вторая репа есть...там есть такая же стата?
Igor
Слышал еще какаято вторая репа есть...там есть такая же стата?
Я только luarocks использую, про другие не в курсах
Snusmumriken
Мне нравится пакет luapower, но из луарокса тоже чего-то наворовано.
Snusmumriken
(ну и ещё мне нравится luajit потому что можно править сишные сорцы на месте без переканпеляций, терпеть не могу переканпелировать)
Snusmumriken
Не совсем. Pypy конечно "компилирует трассы", но насколько я знаю там нет встроенного ffi.
Ruslan
Идея такова что перекомпилируется тот блок кода который был изменён
Snusmumriken
Например смотри, биндинг для либкурл написанный на луях с ffi: https://github.com/luapower/libcurl/blob/master/libcurl.md Если мне нужно допилить биндинг, я такой дописываю фигню на луёвой стороне и оно сразу пашет.
Snusmumriken
Если где-то есть любая сишная длллина например "libcurl.dll", через ффи можно накатать интерфейсы до неё. И этот биндинг суть интерфейс. Надо поправить интерфейсы и добавить новое под новую версию libcurl.dll? Берём такие и дописываем интерфейс на луёвой стороне, получаем ништяки без канпеляций промежуточных длл-ок для связок либкурла и луа. В луажыт это встроенная фишка, в чистую луа для этого надо подгребать alien или аналог.
Ruslan
Вау, надо изучит что за ffi и с чем его едят))
Ruslan
Всмысле микс сишного кода с луа - интересно
Денис
Ребята, только сегодня обнаружил странность. Имеем строку кода: table.insert(message, tostring(self.msg):gsub("%s$", "")) получаем ошибку интерпретации: bad argument #2 to 'insert' (number expected, got string) Это я что-то не понимаю? Я всегда считал, что если мы передаем вторым параметром не number, то это означает, что второй параметр (pos) упущен и нужно использовать позицию по умолчанию (#t)
Денис
Ах ты ж! А я и забыл уже!
Тогда я чудак на другую букву... 🤔
Igor
Хех))
Денис
Для рабочести достаточно в table.insert после gsub'а влепить ещё один аргумент nil.
Так он же в любом случае второй параметр туда впихнет, не?
Igor
Для рабочести достаточно в table.insert после gsub'а влепить ещё один аргумент nil.
Кстати всегда напрягала слегка эта особенность. Иногда хочется результат двух функций сунуть в аргументы другой, но в итое от первой функции передаётся только один параметр.
Денис
Неа
А, то есть, если мы передаем еще помимо возврата, то он вытащит оттуда один
Igor
Когда есть какой-то аргумент после функции, которая возвращает много значений, то передается только один
Snusmumriken
function foo() return 3, 4 end a, b, c, d = foo(), foo() > 3 3 4 nil
Snusmumriken
Первый вызов функции с парой аргументов на возврате не раскрылся и из него взялось только первое значение, второй раскрылся ибо идёт последним.
Snusmumriken
Это небольшой косяк работы с туплами.
Igor
Типа эта особенность не сильно мешает, но если бы её не было, код был бы чутка покрасивее.
Snusmumriken
И про неё желательно помнить.
Igor
Ага
Igor
Я в первый год работы с Lua помню много напарывался на это