
Антон
05.04.2017
10:34:26
а виртуальные методы?

Snusmumriken
05.04.2017
10:34:42
Просто оверрайдишь.

Антон
05.04.2017
10:34:50
переопределение и вызов супера
типа как новый?

Google

Snusmumriken
05.04.2017
10:35:12
Наследуешься и у наследуемого переписываешь метод.

Антон
05.04.2017
10:35:50
вызову его через self.Super:method()?

Snusmumriken
05.04.2017
10:36:24
__index работает как лесенка:
Первая ступенечка - это сам объект. Если не нашли - по __index переходим к другой табличке, и ищем у неё метод. Нашли? Вызвали. Не нашли? Если и у этой таблички есть __index - перешли по ней и там поискали.
А родительские методы - да. Только вот так:
self.Super.method(self, ...), иначе двоеточием в функцию перешлётся Super что не есть хорошо.

Tverd
05.04.2017
10:37:32
машу головой, все так )
Можно было человеку еще предложить MoonScript, там нативные классы

Антон
05.04.2017
10:39:02
вот проект если интересно
https://www.facebook.com/groups/1420889268172393/
еще хотел спросить как реквайры работают?
они просто код встраивают?

Snusmumriken
05.04.2017
10:41:33
Почти.
main.lua:
module = require'module'
print(module.foo()) --> 'bar'
module.lua:
return {foo = function() return 'bar' end}

Антон
05.04.2017
10:42:02
а стражи включения какието есть?
чтобы небыло дублекатов и рекурсивных включений

Google

Tverd
05.04.2017
10:43:23
дубликатов не будет если ты делаешь require 'module'
Он выполняется и прописывается в package, при повторном require берется оттуда
насчет рекурсии не помню, походу просто вываливается в ошибку

Антон
05.04.2017
10:44:20
я модули руками гружу сам

Tverd
05.04.2017
10:44:50
интересно, для чего это?

Антон
05.04.2017
10:44:58
на разных платформах лучше разными методами читать

Tverd
05.04.2017
10:45:22
ага, понятно, прикольно

Антон
05.04.2017
10:45:23
на иосе сендбокс, там надо посылать полный путь
а на винде например лучше относительный - потмоучто если в имени папки будет кириллица то может не найти

Snusmumriken
05.04.2017
11:03:12
Если грузишь руками - можешь сделать свой require:
local cache = {}
function load(path)
if cache[path] then return cache[path] end
local file = io.open(path)
cache[path] = loadstring(file:read'*all')()
file:close()
return cache[path]
end

Антон
05.04.2017
11:03:39
да там уже все сделано
там смысл был подключиться к файлменеджеру общему
это проще из с++ сделать чем его биндить в луа

Snusmumriken
05.04.2017
11:04:28
Оки. Просто с подобной штукой можно баловаться по прямым/относительным путям.
Кстати, require умеет грузить dll/so-либы.

Антон
05.04.2017
11:07:16
на иосе это запрещено)

Snusmumriken
05.04.2017
11:07:43
Есть еще функция dofile, но она не кеширует и грузит только lua-код. И работает с абсолютными путями.
Что с айосом? Все можно же, я проверял.

Антон
05.04.2017
11:07:49
нельзя выкладывать код который может самомодифицироваться, в обход аппстора

Snusmumriken
05.04.2017
11:08:16
Как so-библиотеки самомодифицируются?

Антон
05.04.2017
11:08:22
это не технической орагничение а пункт в девелопер лисенс агридмент

Google

Snusmumriken
05.04.2017
11:08:23
Это же бинари.

Антон
05.04.2017
11:08:35
ну ты их типа можешь закачать и загрузить другую
тоесть линковать можно только статически
не динмаически

Snusmumriken
05.04.2017
11:08:56
Ну, просто тогда стоит запретить вообще все библиотеки.

Антон
05.04.2017
11:09:05
ну так и есть)

Snusmumriken
05.04.2017
11:09:47
Ох. Луа-код вообще стрёмный.
Я делал загрузчик кода с сайта. Ну, как обычный require, только забирает модуль с гитхаба-пастбина.
И это без библиотек кроме сокетов.
Но и сокеты не нужны, ведь есть os.execute
А на тему so-либ - это и правда очень странно.
Я раскапывал кучу сурцов игр на айос, и там есть динамические либы.

Антон
05.04.2017
11:14:23
они все были подключены на момент компиляции

Антон
05.04.2017
11:15:14
ты можешь например сделать #include "dlfcn.h" и вызвать dlopen чтобы загрущить чтото но вот уже выгрузить через dlclose нельзя

Snusmumriken
05.04.2017
11:15:32
Это да. Офигеть. Кошмар.

Антон
05.04.2017
11:15:41
но даже если ты dlopen сделаешь то скорее всего тебя реджектнут при ревьюве
тоесть допускается только линковка средставами хкода

Snusmumriken
05.04.2017
11:16:35
Я просто все подключаю к лав2д динамически, чтобы ядро не пересобрать. И еще FFI использую, для подключения библиотек, которые не предназначены для встраивания в луа.
Теперь понятно что путь на айос мне заказан :3

Антон
05.04.2017
11:17:11
это ты сверху смотришь
а под капотом стандартные иосо-вещи

Google

Антон
05.04.2017
11:17:51
нет почему - если тебе в рунтайме не надо либы переключать то можно собрать и туда

Snusmumriken
05.04.2017
11:18:11
У меня в рунтайме подключается вообще всё.

Антон
05.04.2017
11:18:17
неа
просто укажешь в билд конфиге что подключить вот эти либы. в коде у себя обмажешь #ifnef PLATFORM_IOS

Snusmumriken
05.04.2017
11:19:45
Примерно так:
https://github.com/britzl/steamworks-ffi/blob/master/steamworks/steamworks.lua
Ты не понял, я особо не пишу на плюсах, только крошечные библиотеки, которые потом подгребаются луями. Весь код игр - на луа, за исключением фреймворка, который я не хотел бы пересобирать.
И сторонние библиотеки я тоже загребаю луями. Все. Динамически. Даже те которые не предназначены для загребания.

Антон
05.04.2017
11:21:57
ну ктото же пишет вам энвайр, это его задача будет обеспечить доступность этих либ
юнити так и работает
там тоже все на пакетах построено

Admin
ERROR: S client not available

Антон
05.04.2017
11:22:26
просто под иос все сразу зашивается в билд

Snusmumriken
05.04.2017
11:24:22
Кароч, я и так думал что не буду особо писать на айос, теперь уверен больше.
Да, конечно, я пишу жутко опасные игрушки, которые динамически грузят либы, все методы в которых приводят к sendAllDataFromPhone(bad_guy_ip, 666)
И
sudo rm -rf
Ну ладно.
А ты чего на иос пишешь? :3
Типа, расширяем ца до максимума?

Антон
05.04.2017
11:27:08
я пишу в основном всякие приложения а игру так для души делаю

Snusmumriken
05.04.2017
11:27:41
Ладысь :3
Если приспичит писать на иос, заюзаю юнити тогда.
Хоть шарп и избыточен чудовищно, там удобный бридж в луа. Вывешиваем все методы двигла в луа и пишем на луа.

Tverd
05.04.2017
11:48:05
кокос как вариант

Vlad
05.04.2017
12:54:47
а в луне имеет место перегрузка функций?

Snusmumriken
05.04.2017
12:58:07
List = {}
List.__index = List
function List:new(t)
return setmetatable(t, self)
end
function List:__add(other)
local t = List()
for i, v in ipairs(self) do
table.insert(t, v)
end
for i, v in ipairs(other) do
table.insert(t, v)
end
end
a = List{0, 1, 2, 3, 4}
b = List{5, 6, 7, 8, 9}
c = a + b
print(table.concat(c))
> 0123456789
d = b + a
print(table.concat(c))
> 5678901234

zk
05.04.2017
12:58:52
это перегрузка операций, а не функций

Google

Snusmumriken
05.04.2017
12:59:52
Хм.
local oldprint = print
function print(...)
oldprint('Yoyoyo!', ...)
end

zk
05.04.2017
13:00:18
а это переопределение

Vlad
05.04.2017
13:00:39
foo()
foo(string)
foo(int, string)
и тд

Snusmumriken
05.04.2017
13:00:53
Ты хочешь функцию, которая в зависимости от аргументов подставляет другую функцию?
Такое бывает только при статической типизации.

Vlad
05.04.2017
13:01:17
одну но которая работает в зависимости от аргументов по своем

zk
05.04.2017
13:01:30
if же

Vlad
05.04.2017
13:02:05
ну можно, но просто интересно можт есть воможности перегрузки

Snusmumriken
05.04.2017
13:02:06
Ок.
function foo(a, b, c)
if type('a') == 'string' then
if b then
return a..b
else
return a + b
end
end
Ну, карочи проверка на твоей совести.

Vlad
05.04.2017
13:03:35
тогда ужи через таблицу если будет много всего и разного и там уже проверять как то в зависимости от личной извращености

Snusmumriken
05.04.2017
13:04:16
Во
https://pastebin.com/i7qC1aKn
Тут не самое оптимальное с точки зрения самокопирования, но самое быстрое в плане производительности.

zk
05.04.2017
13:05:31
делай так:
fn func(a)
if string then doString(a)
if integer then doInt(a)
...

Snusmumriken
05.04.2017
13:05:47
function mt.__mul(a, b)
a, b = switchVec(a, b)
return isVec(b) and vector(a.x*b.x, a.y*b.y)
or isNum(b) and vector(a.x*b, a.y*b)
or error('Vector: two vectors or vector and scalar expected, got vector and '..type(b), lvl)
end

Антон
05.04.2017
13:06:00
и у этого объекта сделать несколкьо наследников в зависимости от набора параметров
передавать в ф-ию один инстанс этого объекта как базовый клас

Snusmumriken
05.04.2017
13:06:41
Да, можно и ООП. Но оно не такое быстрое как линейный код. Конкретно тут - векторы для неимоверной производительности, и даже ffi использовано, для особо быстрой работы.

Антон
05.04.2017
13:06:43
методы получения из него данных завиртуалить
говнокодом!