Snusmumriken
Много чего.
jon
я вижу он в паскедж патч что-то пихает
Snusmumriken
Да, это для require, относительных от пути запускаемого в базовом интерпретаторе скрипта.
jon
попробую, спасибо
Snusmumriken
Готово?
jon
пока нет, пытался добить, не вышло, не хочется по проекту размазывать такое полотно, но проверю
Snusmumriken
Вообще, я для себя написал вот это вот:
https://pastebin.com/k00zSt16
И запускаю луёвые скрипты через него. Выглядит примерно так:
luajit.exe /path/to/script_runner.lua path/to/main_project_lua_file.lua
Никаких сайд действий не выполняется, хвосты чистятся, для проекта оно выглядит как будто его запустили напрямую.
jon
а reqire относительно чего вызывать?
Snusmumriken
Относительно любого скрипта в корне проекта.
myproject:
— main.lua
— something.lua
— libdir
— — mylib.lua
*main.lua*
foo = require'something'
bar = require'libdir.mylib'
jon
так точки входа же могут быть разными
Snusmumriken
В каком смысле?
Snusmumriken
У тебя всегда есть скрипт работающий основной точкой входа, и как правило он в корне проекта.
Или что ты пихаешь в качестве точки входа в интерпретатор?
Snusmumriken
Или ты внезапно хочешь запускать допустим mylib.lua? Тогда корнем станет он.
jon
я просто не так давно ознакомился с lua, но как я понимаю, с проектом, с которым вожусь, используются lua скрипты, и отдельно ещё есть тесты, и тут я хз, может ли для них быть иная точка входа
jon
или я не прав и такое не делают?
Snusmumriken
Не должны. И тесты должны быть по хорошему в корне или запущены из корневого скрипта.
jon
хм, значит ещё подумаю
Snusmumriken
Или они делают тупую проверку либ, которые не реквайрят ничего дополнительного, а ля атомарные проверки, что и должно быть по хорошему.
mva
вообще, зависит от того что это за проект
mva
но в среднем по больнице - можно брать за правило что интерпретатор запускается в корневой директории проекта, и пути везде писать относительно этого
Snusmumriken
Если сделано иначе — писали придурки.
jon
вроде разобрался в своей проблеме, но надо будет с колег дёргать, как-то мутно всё
Snusmumriken
Johann:
Всем доброго времени суток! А подскажите пожалуйста. Есть модуль с вот такой инициализацией (параметры опускаю, но если что, это resty.aes):
local _M = { _VERSION = '0.14' }
local mt = { __index = _M }
function _M.new(...)
...
return setmetatable({ ... }, mt)
end
Чем это принципиально отличается от такой инициализации класса:
Class = {}
Class.__index = Class
function Class.new()
return setmetatable({}, Class) -- returns an instance
end
Во втором случае, если мне надо проверить, что мне передан экземпляр данного класса, я могу сделать так:
if getmetatable(obj) == Class then ...
В первом случае так не работает, но зато работает вот так:
aes = require("resty.aes")
obj_meta = getmetatable(obj)
if type(obj_meta) == "table" and obj_meta.__index == aes then ...
Но у меня такое чувство, что я что-то недопонимаю и делаю не совсем так, как надо. Можете объяснить, в чём разница между этими двумя способами инициализации класса? И как правильно проверять, является ли переданный мне obj экземпляром класса aes?
Snusmumriken
Ответ от редакции: принципиальное отличие в том, что в первом случае у тебя таблица "класса" и метатаблица — разные вещи.
Во втором случае — одно и то же, что позволяет наполнять её метаметодами, и они будут применены к инстансам объектов.
Иногда это приводит к нежелательным последствиям, например у объектов появляется метод new, который делает не то что ты хочешь. Но на это обычно можно забить.
Johann
Спасибо.
А сам способ проверки obj на принадлежность классу правильный, или можно как-то короче?
Snusmumriken
Есть пара вариантов. Например такой:
Class = {}
Class.__index = Class
Class.Type = "MyClass"
function Class.new()
return setmetatable({}, Class) -- returns an instance
end
А потом такой:
obj.Type == "MyClass"???
Snusmumriken
Или такой:
function isClass(obj, class)
return getmetatable(obj).__index == class
end
Johann
Но ведь если getmetatable(obj) вернёт nil, будет ошибка в рантайме?
Johann
Тогда может так?
return (getmetatable(obj) or {}).__index == class
Snusmumriken
Ну во-первых не пихай в isClass не объекты ))0
Во-вторых да, можно чуть удлиннить:
function isClass(obj, class)
if type(obj) ~= "table" or type(class) ~= "table" then return end
local mt = getmetatable(obj).__index
return mt and mt.__index == class
end
Johann
Ну в том то и дело, что я пишу нечто для генерации токенов доступа, и предполагаю, что мне одним из параметром передадут уже проинициализированный объект от resty.aes, но надо бы проверять по правилам хорошего тона. Я в lua пока что новичок. Хотя итераторы уже освоил ))
Snusmumriken
Ну карочи дело принципиально несложное, я обычно ещё каждому классу (в функции-генераторе классов) добавляю метод типа:
MyClass:Type(something)
if type(something) == "string" then return self.__type == something end
if type(something) == "table" then return getmetatable... == something end
return self.__type
end
Шоб было прям многозначное применение в случае чего, и так и эдак.
Александр
Александр
🏛🏛public class🏛🏛
Тут есть кто с Еревана?
🏛🏛public class🏛🏛
это связано с айти в любом случае
mva
mva
алкоголизм тоже связан с химией, например. Это не повод искать собутыльников в чате химиков-технологов
mva
и это только "во-первых"
mva
а во-вторых, nometa.xyz
mva
есть вопрос - надо задавать его, а не метавопросы
mva
это будет более уважительно по отношению к собеседникам и сэкономит время обеим сторонам
Aqendo
Highly Likely
Сергей
Здравия!
Сергей
Хочу себе красивые коньки, в луа не в зуб ногой. Подскажите книжку по этому волшебному языку)
Igor
Igor
Читай закрепы чата, там всё есть
Александр
Сергей
Читай закрепы чата, там всё есть
Там есть гугли. Я спрашивал не потому что это не умею, а потому что интересно мнение тех, кто с ним знаком. И может посоветовать наилучший вариант.
Сергей
Igor
Благодарю!
Именно на эту книгу ссылка в закрепленных сообщениях чата и находится
Igor
Я туда и отправил потому что сам читал эту книгу и могу её посоветовать.
Сергей
Сергей
Хм... И оба про одну и ту же книгу)) ушел качать, читать) ещё раз благодарю за напутствие)
Сергей
P.S.: приходите в гости)
Сергей
Ааа ссылки запрещены))
Aqendo
оказывается я путешественник во времени. Написал в следующий день, пока еще в 8ом мая :D
Igor
Igor
Но может не в следующий, а в прошлый. Тогда получается назад в будущее.
Igor
Мышку на тайминг наведи, станет ясно)))
Aqendo
Не знаю почему, но в KDE PLASMA баг,я указал время Москву, а там на 3 часа позже, думал чзх, поставил UTC и (о чудо!) стало московское
Александр
Не знаю почему, но в KDE PLASMA баг,я указал время Москву, а там на 3 часа позже, думал чзх, поставил UTC и (о чудо!) стало московское
Не в ней, а в биосе(а точнее несостыковке времени различных ОС и системных часов биоса), т.к. у тебя там могут различаться время биоса и системы, плюс если у тебя стоит одновременно винда, то у тебя она может ставить биос как московское, в тоже время линь будет считать биос как УТС
Aqendo
mva
эт, товарищи... А напомните, пожалуйста, как бы в 5.1-синтаксисе выйти из вложенных циклов, но не из функции внутри которой они выполняются?
fgntfg
break?
mva
mva
в смысле, не только из самого глубокого вложенного, но вообще из всей цепочки вложенных циклов
mva
и вернуться на уровень функции
fgntfg
Добавить флаг и условие выполнения цикла
fgntfg
Ну или 5.2 и goto