Alex
Also there is a similar syntax for storing functions in tables: function a.b.f(...) end
Alex
"a" я так понимаю это таблица и ее нужно сначала инициализировать
Alex
f - это имя функции
🌗
это сложновато
item:extend() = extend(item) item.extend() = extend(), который создан в таблице item
Alex
что такое "b"????
Alex
item:extend() = extend(item) item.extend() = extend(), который создан в таблице item
это выглядит как метод класса, хотя на самом деле это не класс, а список, который тоже не является классом. я к этому никогда не привыкну. но суть вроде уловил
Alex
a = { b = { f = function() end } }
список списков, ясно понятно. a:b:f() по крайней мере не сработало, уже легче
Это не списки, а таблицы.
Snusmumriken
Also there is a similar syntax for storing functions in tables: function a.b.f(...) end
a — это таблица, которая при этом содержит таблицу b, и ты добавляешь в неё функцию f. a = {b = {}} function a.b.f(a, b) return a + b end Аргументы в функции работают буквально как локальные переменные, так что они могут "затенить" другие переменные в теле функции.
Snusmumriken
список списков, ясно понятно. a:b:f() по крайней мере не сработало, уже легче
Двоеточие намекает на вызов функции сразу после двоеточия. a.b:f() передаст таблицу b в функцию f как self. a:b.f() не сработает, b это не функция, хе, вместо этого пиши a.b.f(a).
Alex
В рекурсивных функциях пример: return f().x -- not a tail call, the function's return value needs to be used in a table index expression after it returns
Alex
f().x это как?
Tony
f().x это как?
Ну как, f() возвращает объект, у которого есть поле х
Tony
И к нему мы собираемся получить доступ
Snusmumriken
В рекурсивных функциях пример: return f().x -- not a tail call, the function's return value needs to be used in a table index expression after it returns
f().x это изъятие ключа x у таблицы, которую вернула функция f при вызове. function f() return {x = 10, y = 20} end print( f().x ) --> 10
Snusmumriken
Можно сделать рекурсивной, лол кек. function f(a, b) if a < b them return f(a + 1, b) end return {x = a, y = b} end f(10, 20).x --> 20 Ну ты понел. Функция рекурсивна, но под конец возвращает табличку.
fgntfg
Сын сегодня про lua спрашивал. Осваивает роблакс похоже
jon
Всем привет, а как в формате gmt получить время?
jon
На стековерфлоу я нашёл ответ, который странно работает) в разных онлайн редакторах разный результат выдается
Snusmumriken
Всем привет, а как в формате gmt получить время?
То есть как в формате gmt? Тебе нужно просто время по гринвичу? Или просто получить строчку а ля "UTC+4"?
Snusmumriken
На стековерфлоу я нашёл ответ, который странно работает) в разных онлайн редакторах разный результат выдается
Разные онлайн редакторы в разных часовых поясах лол. Если оно вытаскивает часовой пояс из ОС то результаты будут разные в разных поясах.
jon
Или я ошибаюсь?
Aqendo
gmt это же по Гринвичу время?
гмт это не часовой пояс?
Snusmumriken
Ммм, я переставлял часовой пояс и спрашивал луа про время. И каждый раз получал одну и ту же минуту.
Snusmumriken
Потому что он по гринвичу.
Snusmumriken
А вот os.date уже кажись конвертирует в дату с поясами.
Snusmumriken
Так, или нет. Надо чекнуть, хмм.
jon
https://gist.github.com/ichramm/5674287
jon
Таки нашёл) другим поисковиком воспользовался
Snusmumriken
Да, таймштампик действительно не зависит от часового пояса, а вот преобразование его в дату тем или иным образом запоминает часовой пояс при запуске программы, и при получении даты берёт часовой пояс с запуска. Давно хотел это проверить.
SapDragon
Здраствуйте, появился еще вопрос по Sol. У меня есть условный структ: struct Test { int First = 0; } Я получаю ссылку на First: auto& PointerToFirst = *(int*)((std::uint32_t)(Test)); И передаю его в луа, как я понимаю луа получает значение по ссылке, и сохраняет в инт: lua["TestReference"] = PointerToFirst; Поэтому, когда я пытаюсь прочитать значение по TestReference спустя время, то там остается старое, и при попытке записать что-то тоже самое ( TestReference = 606 ) Поэтомв вопрос: Возможно ли как-то передать именно ссылку в луа?
Igor
А юзердату уже какими-то внутренними методами нужно будет читать, будь то заранее реализованная тобою сишная функция, либо же ffi.
SapDragon
Ссылку передать ты можешь только в виде юзердаты, других вариантов нет
Я просто видел получение референса в одном апи для моддинга Условно у игры есть класс class C_Player { int iHealth = 0; } В апи есть метод: player.Health = 0; value = player.Health
SapDragon
Я просто видел получение референса в одном апи для моддинга Условно у игры есть класс class C_Player { int iHealth = 0; } В апи есть метод: player.Health = 0; value = player.Health
то есть он в любом случае не мог передавать как юзер дату, еще возможно ставит свои кастомные сеттеры и геттеры как прокси над луа?
Igor
Я просто видел получение референса в одном апи для моддинга Условно у игры есть класс class C_Player { int iHealth = 0; } В апи есть метод: player.Health = 0; value = player.Health
Не знаю, может SOL и имеет какие-то приколы для этого, но чистый луа именно что не умеет получать числа из сишных ссылок. И я очень сильно сомневаюсь, что SOL умеет.
Денис
то есть он в любом случае не мог передавать как юзер дату, еще возможно ставит свои кастомные сеттеры и геттеры как прокси над луа?
А что говорит type() на этот объект? Может там кодеры суровые и дублируют все изменения классов где-нибудь в луёвом стейте?
SapDragon
а поле к которому он обращается number ( по логике ссылка )
Денис
а поле к которому он обращается number ( по логике ссылка )
Значит там навёрнута метатаблица с переопределенным index/newindex
SapDragon
Значит там навёрнута метатаблица с переопределенным index/newindex
Не совсем понимаю как это, можете привести пример?
Денис
А вот мне интересно: при создании метатаблиц воротить обычные методы лучше в первом параметре setmetatable() или сразу же пихать их во второй?
Денис
SapDragon
Сможете прочитать код на PureBasic?
Предполагаю, что да, но не уверен
SapDragon
А, это условная обёртка над Get / Set?
Денис
Предполагаю, что да, но не уверен
В этой реализации при вызове метода new создается юзердата структуры LUASOUND и на нее навешивается метатаблица, которая создана в процедуре luaopen_luasound
Денис
А, это условная обёртка над Get / Set?
Ну какбэ да. Мы же с помощью метатаблиц можем воротить поведение таблиц, которое таблице являться не будет
Денис
if type(obj) == "userdata" and getmetatable(obj) == myclassmt then print("Это мой мальчик") end
Ну так да. Просто если тип был бы "table", значит кодеры создали глобальную переменную и в сеттерах/геттерах и остальных функциональных частях кода просто переписывают значения в этой самой глобальной таблице.
Денис
if type(obj) == "userdata" and getmetatable(obj) == myclassmt then print("Это мой мальчик") end
А если userdata, значит кодеры поступили проще - реализовали юзердату класса и метатаблицу к нему.
Alex
почему интересно в официальной документации операторы присвоения обозначаются через ::= ?
Alex
Alex
ведь это же по факту не работает
Alex
и по конструктору таблиц так и не понял
Alex
tableconstructor ::= ‘{’ [fieldlist] ‘}’ fieldlist ::= field {fieldsep field} [fieldsep] field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp fieldsep ::= ‘,’ | ‘;’
Alex
когда ключ нужно в квадратные скобки оборачивать и когда нужно еще и кавычки?
Highly Likely
Это формальное описание конструкций. Это не синтаксис языка. Грамматика, строго говоря.
Highly Likely
Alex
привык работать с официальными документациями, но пока что действительно вижу какие то не понятно чем обоснованные усложнения
Highly Likely
tableconstructor ::= ‘{’ [fieldlist] ‘}’ fieldlist ::= field {fieldsep field} [fieldsep] field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp fieldsep ::= ‘,’ | ‘;’
Если ты обратишь внимание, процитированная тобой конструкция описывает грамматические правила конструктора таблиц. Сверху — наиболее общее
Alex
Это формальная грамматика языка
а можно где то посмотреть правила этой формальной грамматики? что бы понимать где синтаксис языка, а где правила
Alex
Programming in Lua то, что тебе нужно
Нашел третье издание на русском, оно под 5.2. Четвертое последнее издание только на английском, под 5.3. За какое браться?
Alex
Под актуальную 5.4 видимо только официальная дока на сайте. Были какие то значимые изменения по синтаксису за 10 лет или можно на это не заморачиваться?
Alex
Highly Likely
Там есть различия, но некритичные между 5.1 и 5.4 в синтаксисе
Highly Likely
Если с английским норм, можно читать про 5.3
Highly Likely
Если с ним туго, можно брать 5.2 и не париться
Alex
Обычно, когда вы работаете со списком, вам нужно знать его длину. Она может быть константой или может быть где-то записана. Обычно мы записываем длину списка в поле с нечисловым ключом. По историческим причинам некоторые программы используют для этих целей поле "n".