Snusmumriken
Итак, что тут вообще происходит:
Первый модуль, который запускается интерпретатором, в "..." получает путь до файла и дополнительные аргументы при запуске.
Если этот модуль дёргает другие модули - те получают то, что вызывалось в require.
Таким образом, можно выяснить путь до модуля, допустим, в основном файле заводим табличку arg, и пихаем туда "...".
Тогда путь во вспомогательном файле - arg[1]..'/'..(...)
Лично я стараюсь не использовать дебажную либу, ибо она может влиять сразу на всё.
Alexander
а из самого модуля не узнать?
Snusmumriken
Узнать, но можно ошибиться если он внезапно находится не по пути с основным файлом. За этим уже ты следишь.
Snusmumriken
Карочи:
main:
arg = {...}
require'folder_in_place_with_main/scr'
scr:
print('path of current file: '..arg[1]..'/'..(...))
Напечатает:
c:/folder_with_main/folder_in_place_with_main/scr
Ну, в юниксах - что-то вроде /home/documents/folder_with_main/folder_in_place_with_main/scr
Alexander
а, понятно!
у модулей внутри (...) будет относительный путь от вызывающего
Snusmumriken
Дыа, включая их имя, без формата ".lua".
Alexander
пасиба )
Snusmumriken
Собсно, '...' это список аргументов при вызове.
Первые пять аргументов можно получить, например, так:
a, b, c, d, e = ...
Пихнуть сразу все в табличку -
tbl = {...} - это типичное преобразование кортежа (скрытый тип данных lua) в таблицу.
Обратно, из таблицы в кортеж - unpack:
a, b, c, d, e = unpack{1, 2, 3, 4, 5}
Использование со скобками (...) - вытаскивание первого элемента кортежа.
Я к тому, что можно запускать файлы с дополнительными ключами:
> lua c:/path_to_script/file.lua bla-bla YourMommyTooFat
А в самом скрипте:
arg1, arg2, arg3 = ...
Теперь
arg1 = 'c:/path_to_script/'
arg2 = 'bla-bla'
arg3 = 'YourMommyTooFat'
Типа того.
Увы, с require это не работает. То есть, нельзя вызвать
require('module', 10, 20, 30)
Но сам модуль может возвращать функци инициализации модуля, и аргументы туда можно пропихнуть так.
Но зато имя модуля говорит нам, откуда можно вызывать дополнительные скрипты, и по нему можно определять, что файл запущен как модуль, и запускать юнит-тесты если мы вызываем его прямо, не модулем.
Светомеч
Snusmumriken
Тут уже всё аргументировано, перечитай :)
Мерль
https://twitter.com/Soukhinov/status/823506003018862594
Snusmumriken
Очередной 0x5f3759df? Можно попробовать подогнать ещё ближе.
kapkapbopoh
Что по луа почитать ( планирую на нем писать скрипты/плагины/аддоны для игр )?
Alex
Книги.
kapkapbopoh
Alex
Alexander
Иерусалимский, а живёт в Бразилии. Мир странно устроен)
Snusmumriken
Зато доцент католического университета, так что несёт миссионерскую ношу бразильским студентам.
Dmitry
Всем привет
Dmitry
как вычислить array size на lua 5.3
Alexander
что есть array size ?
Dmitry
размер массива
Alexander
*как* ты его определишь
Dmitry
a = {}
Alexander
a = {}
есть операция`#a`
она тебя не удовлетворяет?
Dmitry
а где прочитать
Alexander
в справке по языку
Dmitry
там только так table.getn(a)
Alexander
где "там" ?
Dmitry
https://www.lua.org/pil/19.1.html
Dmitry
как-бы официальная дока
Alexander
это *книга* от автора языка, а не дока
Dmitry
а можешь сказать где прочитать доку
Alexander
http://www.lua.org/manual/5.3/manual.html#3.4.7
Alexander
поправил ссылку, указывает на оператор #
Dmitry
a.__len
Dmitry
иль я чет путаю?
Alexander
и там есть важная оговорка - этот оператор по умолчанию возвращает длину наибольшей непрерывной пронумерованной последовательности элементов от единицы.
все остальное в подсчете игнорируется .
Dmitry
for i,a in ipairs(dimensions) do
positionsCount[i] = a.__len
end
Dmitry
иль я неверно понял?
Alexander
Alexander
ну __len - это то же самое что и #
Dmitry
но этож перебор и он должен долгий быть
Alexander
Dmitry
чет nil выводит
Alexander
если ты хочешь знать количество всех элементов таблицы, и не хочешь связываться с перебором элементов таблицы, то тебе надо написать свой метаметод присваивания (другими словами, переопределить оператор присваивания элементу таблицы), и считать в нем
Alexander
а что внутри dimensions ?
Dmitry
массив масивов
Dmitry
local dimensions = {
getBigArray(1500),
getBigArray(150),
getBigArray(15),
getBigArray(3)
}
Alexander
ага, и ты хочешь знать длину каждого входящего массива?
Dmitry
да
Alexander
а, понял
Alexander
a.__len - это ссылка на функцию, и она не определена. поэтому nil
Dmitry
for i,a in ipairs(dimensions) do
positionsCount[i] = #a
end
Alexander
for i,a in ipairs(dimensions) do
positionsCount[i] = #a
end
Alexander
да
Dmitry
во так пашет
Dmitry
спс
Dmitry
дока основная не очень то и понятна
Dmitry
уж сорь что отвлек
Alexander
как это бы сказать, сам по себе язык в итоге логичнее, чем пхп :)
на мой вкус
Dmitry
да
Lyubov
Привет всем! Тут только по вопросам технического характера можно писать? У меня есть интересная вакансия Lua разработчика на высоконагруженные проекты
Alexander
Lyubov
Не угадали 😁😁😁
Lyubov
Нет
Lyubov
Iponweb
Lyubov
https://www.youtube.com/watch?v=64c4ihDl6MM&index=28&list=PLH-XmS0lSi_yLq2XS2Y1DScY6NPbQj4Dt
Lyubov
доклад рядом с предметной областью, кстати
Snusmumriken
Кстати да. Строки с упоротой (но быстрой) хеширующей функцией и сборщик мусора - это актуально.
Теперь интересно, что делать со сборщиком, ибо у меня куча объектов. Разве что ручками запускать/останавливать.
Alexander
Alexander
- Мам, пап, смотрите. Мой новый друг Майк.
- Еп, мертвый сборщик мусора!
- Майк, пойдем, нам тут не рады.
Светомеч
Snusmumriken
Смотря что, как всегда. Если микросервисы с хранилищем на жд - ваще отлично. Десятки lanes-тредов, которые бодрыми хомячками грызут запросики.
Snusmumriken
Ясное дело что не везде. Ровно по этой причине - "смотря что".
Snusmumriken
Ща тестю бета-версию, хех. Засираю память полностью.
Snusmumriken
У меня, на х32 - пара гигов. Потом хоть пишет "Недостаточно памяти", вместо того чтобы резво крашиться.
А версия у love2d х32 - 1 гиг, и резво крашится.
Snusmumriken
2.1 - первое.
2.0.0.4 - love2d
Snusmumriken
x32 мб.