not next(obj) — канонiчный способ для таблиц.
Andrey
да, спасибо, сработало. извините, ночь, туплю
Alex
Alex
всё бывает))
Andrey
Раз уж зашел Такой вопрос local arr=rn:getElements() for _,v in pairs(arr) do end Почему зеробрайн студио иногда зачеркивает при подсаетке то что после local
Alex
ой я только в атоме и vs code писал соррян )) зеро брейн не помне )
Alex
но единственное могу сказать что наверное парсер не до писан , хотя
Alex
а на какой это строке ?
Andrey
все догадался. просто потом такая же переменная определяется
Andrey
ниже по коду
Andrey
не переменная, таблица или как там правильно обьект массив :))
Alex
не ну в луашном стиле это таблица , но как программист приятне что люди делят это на объекты и массивы , что бы не было не додумок и т.д. ))
Alex
но это сугу бо моё мнение , его можно не разделять )
Andrey
слухайте а еще такой вопрос задалбливает писать такие function Foo:bar1() end function Foo:bar2() ... self:bar1() ... end return Foo Можно как то избавиться от Foo что бы в каждом методе не прописывать одно и тоже ? Это через запятую перечислять в массиве ?
Ivan
ты хочешь не писать Foo?
Andrey
да
Andrey
мне кажется оно избыточно
Alex
local Foo = { bar2 = function() end bar1 = function() end }
Alex
запятая =___=
Andrey
а двоеточие, сахар ?
Ivan
Foo = { bar1= function() end, bar2 = function() bar1() -- так не получится end }
Alex
сахар это когда Foo:get{as:g"test"}
Andrey
не, я про то что у меня в каждом методе еще self передается
Alex
считай опускаешь скобки вокруг переданных аргументов
Alex
@Zmey_14 To` Ещё раз свой вопрос тогда уж ))
Andrey
сек. ща
Alex
Alex
если ты точно хочешь вызывать bar1
Alex
nj njulf
Alex
Alex
в первом примере забыл двойку написать на каждую функцию котороую вызывал
Andrey
Ivan
кидайте кодом пожалуйста
Andrey
вот что бы не загромождать код Foo и (self как нить можно облегчить ? кодом не могу сейчас...
Alex
ну что бы писать меньше раз Foo то тогда просто при объявление таблицы сращу в ней пиш как я показал Foo:bar2() и Foo.bar2(Foo) одно и тоже написание
Alex
и кстати раз у тебя bar1 не работает со self то ( не надо её делать методом) не надо писать : лучше точкой обойтись ( просто статической функцией)
Alex
local Foo Foo = { bar2 = function(self) return Foo.bar1 end, bar1 = function() return 1 end, BBBBB = function() return 'some text' end, } return Foo
Alex
куда ещё меньше ))
Andrey
так. я собственно подумал а нафига мне в каждом классе прописывать название длинное. если можно обойтись одной буквой типа вместо Foo какой нить C и его же и возвращать
Alex
и так у тебя есть A B C D N G ..... где то там одна из этих букв отвечает за клиента но это буква в твое коде и тебе ответит как то так A is nill value
Alex
Alex
но это не луа
Alex
тююю export default a )))
Andrey
не ну я вначале определю например node.lua local A={} function A:bar1() end ... return A а когда буду библиотеку дергать что то типа local NodeLib=require("node") вначале ей же пофиг что там было A
Alex
просто я за понятные название , всеголишь то ))
Alex
так вот к сути
Alex
Вопрос как меньше , вариант написал . Удобо читаем или нет дело третье )) Тут вопрос же был в кол-вах символов
Andrey
да. а то загромождает
Alex
такой синтаксис что поделать ))
Alex
хотя
Alex
-return { bar1 = function() return 1 end, bar2 = function(self) return self.bar1 end, BBBBB = function() return 'some text' end, }
Alex
при условии что
Alex
local node require "node" node.bar2(someElse) не будит ни когда так написан ибо будет ошибка node:bar2(); только так все отработает
Alex
local function fullName (name) return function (fio) print(table.concat({name, fio}, ' ')) end end fullName"Alex""Novi"
Alex
вот кстати что называется сахаром ))
6 :)
кончилось...
Snusmumriken
Это жаваскрипт со стрелочными функциями. Очень красиво, но стрелочные функции вводили не для сокращения методов, а для лямбд. То есть, функций которые подаются аргументами в другие функции (там такие сокращения оправданы), и если ты почитаешь стайлгайды, то описывать методы объектов в жаваскрипте стрелочными функциями это, помнится, муветон, ибо их немножко сложнее визуально выделять. Но если ты всё таки хочешь сверхкраткого синтаксиса в луях — мунскрипт в помощь, оно собирается в луа. https://moonscript.org/
Snusmumriken
А если прям вот так вот задалбывает каждый раз писать functon Class:method(foo, bar) ... end Напиши сниппет для этого дела, и копипасть. Полная форма очень способствует читаемости.
Snusmumriken
Гипотетически (ещё раз повторяю, гипотетически), можно извратиться с setfenv или аналогом. Типа мы переключаем энвайрнмент под текущий класс, и все переменные которые мы объявляем начинают относиться к нему. Но это будет жутко : ) Типа: local _G = _G function DEFINE_CLASS(t) t = setmetatable(t or {}, {__index = _G}) setfenv(t) end function ENDEFINE_CLASS() setfenv(_G) end local Class = {} Class.__index = Class DEFINE_CLASS(Class) function new(self, x, y) local o = setmetatable({}, self) o.x, o.y = x, y return o end function area(self) return self.x * self.y end ENDEFINE_CLASS() local obj = Class:new(10, 20) print(obj:area()) --> 200 Я не тестировал, может я что-то не понимаю, но есть шанс что что-то подобное можно замутить. Правда, между lua5.1 и 5.2 есть различия в том числе в наличии setfenv, но мб получится сделать аналог. И сама затея ужасная, но я хочу попробовать.
Ivan
20
Igor
Всем привет, есть такой вопрос, он с C API связан по большей части, есть у меня lightuserdata, к ней привязана метатаблица, таких юзердат у меня много, разных типов, так вот, в чём суть, мне нужно определить точно что это за юзердата была передана в функцию. Вызываю я, к примеру, из под Lua cfgStore:purge() всё хорошо, только вот проблема в том, что в функции :purge() на стороне Си у меня нет проверки правильная ли юзердата пришла, так что если я вызову например config.purge(client), где client - уже поинтер на другую структуру другого типа, функция всё равно продолжает выполняться, а по скольу поинтер совершенно на другую структуру по типу вся программа весело крашится. P.S. luaL_checkudata(...) работает, как выяснилось, только с обычной userdata, которая выделяется самой машиной Lua, с lightuserdata не работает
Igor
Была идея сравнивать указатели на метатаблицы и выдавать typerror если что-то не так, но не придумал как это грамотно сделать
Super
привет ребята, у меня тут свежий вопросик по луа, кто шарит в луа stream module
Super
stream { lua_shared_dict scache 5m;
Super
вот я сделал скажем луа шаред дикт в блоке стрим
Alexey
LightUseraData тип может иметь только одну метатаблицу. Как,например строки или числа
Igor
Это я знаю, у меня несколько метатаблиц и несколько юзердат, которые на разные структуры указывают
Igor
мне нужно как-то реализовать проверку пришедшей юзердаты в функцию
Νῑκόλαος
KeraLua кто нибудь использовал? Контроль памяти удавалось реализовать?
Igor
потому что сейчас этой проверки нет, у меня просто используется функция, которая пришедшую юзердату кастует в структуру, которая нужна вызванной функции
Igor
и если это юзердата, но не того типа, что должен вызывать эту функцю - segfault
Igor
Вот к примеру функция push, создаёт lightuserdata по поинтеру на структуру и присваивает метатаблицу
Igor
есть функция toClient, которая преобразует пришедшую дату в поинтер на структуру но не проверяет, является ли она структурой CLIENT или это какая-то другая, нужна, скажем так, функция checkClient, которая тащит из стека юзердату и проверяет её на соответствие типу
Igor
А вот как эту проверку на соответствие типу реализовать я что-то не могу придумать
Igor
Как я уже писал выше, lua_checkudata которая принимает последним аргументом название, которое присваивается юзердате работает только с обычной юзердатой, не light
Igor
точнее там присваивается не просто название ей, а название метатаблицы
Igor
Вспомнил про существование rawequal и у меня получилось сравнить две метатаблицы у объекта и полученную по имени, вышло именно то, что мне нужно. Ну... на первый взгляд, дальше посмотрим
Alexey
Можно хранить lightuserdata в отдельной таблице. Но надо не забывать ее очищать Или просто использовать full userdata с указателем в качестве значения