Как мне реализовать Obj C-подобные заголовки в Lua? - PullRequest
0 голосов
/ 08 июня 2018

Теперь у меня есть функция import(a), которая короткими словами dofile заголовок в .framework, например: import("<Kakao/KARect>") => dofile("/System/Library/Frameworks/Kakao.framework/Headers/KARect.lua")

А в KARect.lua, например, у меня есть:

KARect = {}

function KARect:new(_x, _y, _width, _height, _colorBack)
    local new = setmetatable({}, {__index = self})

    new.id = KAEntities:generateID()
    ...

    return new
end

function KARect:draw()
    ...
end

Через некоторое время я подумал о том, чтобы переработать эту систему и заставить «заголовки» работать как обычные модули Lua с расширенным require(), поэтому функция будет выполнять, например:

import("<Kakao/KARect>") => package.path = "/System/Library/Frameworks/Kakao.framework/Headers/?.lua"; KARect = require("KARect")

и файл будет содержать:

local KARect = {}

...

return KARect

Поскольку заголовки должны не содержать что-либо, кроме только классов с их именами?Я смущаюсь, думая об этом, так как я никогда не использовал Obj C: s

1 Ответ

0 голосов
/ 08 июня 2018

Я никогда не использовал Obj C

Тогда почему вы пытаетесь реализовать его заголовки на языке, который вообще не использует заголовки?

Заголовок!Что такое заголовок?

Заголовочные файлы на C-подобных языках хранят больше, чем просто имя.Они хранят константы и макрокоманды, аргументы метода и метода класса и возвращаемые типы, поля структуры и класса.По сути, содержимое файла заголовка является предварительным объявлением.Они возникли из-за необходимости выполнять одинаковые предварительные объявления для многих файлов.

Я не знаю, какие дополнительные правила и функции были добавлены в заголовочные файлы в Obj-C, но вы можете получить общиепонимание того, что они делают, по следующим ссылкам: 1 , 2 , 3 , 4 , причем последняя является наиболее точнойвкл.

Ответ на текущий вопрос

Lua - интерпретируемый язык с динамической типизацией.Он не выполняет проверку типов времени компиляции, и, как правило, программы Lua могут и должны быть структурированы таким образом, чтобы не требовалось предварительное объявление между файлами.Таким образом, для программиста нет никакого осмысленного способа создать, а для генератора и интерпретатора байт-кода lua - использовать файлы заголовков.

Lua вообще не имеет классов .Код, который вы опубликовали, является синтаксическим сахаром для назначения функции с немного отличающейся сигнатурой для таблицы, которая имитирует класс:

KARect.new = function( first_arg_is_self, _x, _y, _width, _height, _colorBack)
    local new = setmetatable({}, {__index = first_arg_is_self})
    return new
end

Здесь нет объявлений, только генерация анонимной функции иего присвоение полю в таблице.Другим частям программы не нужно ничего знать о конкретном поле, переменной или функции (которая хранится в переменной) заранее (в отличие от C).

Итак, ни одно объявление не означает ничего, что можно отделить от реализации.Конечно, вы можете сначала перечислить поля таблицы классов и сделать им фиктивные присваивания, но, опять же, Lua не будет использовать их.Если вы хотите дать подсказки людям, возможно, лучше написать отдельное руководство или поместить комментарии в реализацию.

У Lua ситуаций , где необходимы предварительные объявления для ссылки на локальные функции.Но такая ситуация не возникает в объектно-ориентированном коде, поскольку доступ ко всем методам осуществляется посредством ссылки на объект, и к моменту создания первого объекта сам класс обычно полностью создается.

...