Snusmumriken
Нет
Snusmumriken
А
Snusmumriken
Стоп
Snusmumriken
Понимаешь что ты вообще сделал? ))
Ruslan
да, в таблицу добавил ключ area с значение 123
а моя желанная функция осталось в мета не тронутой
Snusmumriken
Как работает __index?
Snusmumriken
Для чего он вообще нужен?
Ruslan
при обращении по ключу или индексу - хукается туда
Ruslan
если нужно его поведение изменить то велком как говорится
Snusmumriken
Это фолбек для ключей. Если запрошенного ключа нет в оригинальной таблице, смотрит по __index'у.
Ты добавил ключ совпадающий с метатабличной фигнёй. Всё, теперь удаляй чтобы иметь доступ к функции.
Ruslan
можно перенаправить, подусуть другую таблицу
Snusmumriken
То что так гипотетически можно сделать не значит что это нужно делать. Андестенд? Хотя появляется простор для манки-патчей.
Ruslan
Snusmumriken
А зачем тогда делал? ))
Snusmumriken
getmetatable(o).__index.area — вот так можно, но нахера было изначально затенять имя метода?
Ruslan
фолбек - понял, хотел написать что если не найдено но чутка засомневался)))
Ruslan
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
Snusmumriken
Это если прям очень надо накакать и всё защитить от дуболомов. Но замедление и в общем-то бессмысленная ерунда.
Ruslan
Snusmumriken
Snusmumriken
Обычно лучше использовать интерфейсы, безусловно.
Ruslan
Поделитесь списком масхевных/ходовых пакетов по вашему мнению
Ruslan
Для себя открыл пакет inspect.lua
https://github.com/kikito/inspect.lua
Igor
Snusmumriken
Igor
Для разных задач и мастхэвы разные
Snusmumriken
Вот-вот. У меня как мастхев идёт луасокет и куча моих батареек а ля моя class-либа.
Snusmumriken
Вот это ооп в сотне строчек.
https://pastebin.com/K1yRyE1T
Ruslan
Snusmumriken
Ну например чот такое:
https://pastebin.com/ZvejNYr3
https://pastebin.com/G8nvJ0Bi
Ruslan
Snusmumriken
Разумеется, там вообще всё предельно тупо и быстро
Ruslan
*просто с телефона щас
Ruslan
Snusmumriken
Ну первое для работы с табличками, а ля набор итераторов и типа-функциональщины map-filter, довольно быстрой и оптимизированной.
Snusmumriken
filter это вообще весьма прикольная и оптимизированная штука для удаления элементов из массива с парой курсоров "что проверяем" и "куда вставляем если оно норм".
Ruslan
Ruslan
Фильтр и в питоне есть, если не истина то итерация пропускается
Snusmumriken
Фильтр тут — буквально фильтрует массив, но делает это на месте, буквально чистит его от чего либо. Если нужна копия — делаем копию и фильтруем её, ибо нефиг плодить копии на пустом месте.
Второе — строчечки и работа с ними, конвертация в 1251 для венды и обратно (сворованная), кодирование в url и обратно, итераторы по utf8-символам, сплиты, слайсы, тримы и всякое такое.
Ruslan
Полезные штуки) , благодарю
Snusmumriken
Вот тут ещё можно прилично наворовать. Пакет в целом хорош, основная часть требует luajit/ffi, но есть утилити вроде glue, которые на чистых луях пашут
https://luapower.com/
Igor
Snusmumriken
Мне нравится пакет luapower, но из луарокса тоже чего-то наворовано.
Snusmumriken
(ну и ещё мне нравится luajit потому что можно править сишные сорцы на месте без переканпеляций, терпеть не могу переканпелировать)
Ruslan
Snusmumriken
Не совсем. Pypy конечно "компилирует трассы", но насколько я знаю там нет встроенного ffi.
Ruslan
Идея такова что перекомпилируется тот блок кода который был изменён
Snusmumriken
Например смотри, биндинг для либкурл написанный на луях с ffi:
https://github.com/luapower/libcurl/blob/master/libcurl.md
Если мне нужно допилить биндинг, я такой дописываю фигню на луёвой стороне и оно сразу пашет.
Ruslan
Snusmumriken
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
Денис
Igor
Хех))
Snusmumriken
Денис
Igor
Денис
Неа
А, то есть, если мы передаем еще помимо возврата, то он вытащит оттуда один
Igor
Когда есть какой-то аргумент после функции, которая возвращает много значений, то передается только один
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 помню много напарывался на это