ㅤ
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
и его же и возвращать
Andrey
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, но мб получится сделать аналог. И сама затея ужасная, но я хочу попробовать.
🐅🤦♂️
Гипотетически (ещё раз повторяю, гипотетически), можно извратиться с 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, но мб получится сделать аналог. И сама затея ужасная, но я хочу попробовать.
Если это работает, то не хватает подсветки кода в редакторе другим цветом между DEFINE_CLASS и ENDEFINE_CLAS
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 с указателем в качестве значения