@ProLua

Страница 71 из 307
Антон
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 использовано, для особо быстрой работы.

Страница 71 из 307