我应该如何在 Lua 中实现 Obj C-like headers?

How should I implement Obj C-like headers in Lua?

现在我有一个 import(a) 函数,简而言之 .framework 中的 dofile 的 header 是这样的: 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

一段时间后,我考虑重新设计这个系统并使 "headers" 像具有高级 require() 的典型 Lua 模块一样工作,这样功能就可以完成,例如:

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

文件将包含:

local KARect = {}

...

return KARect

因为 headers 应该 包含任何东西,但只有 类 和他们的名字?一想到它我就糊涂了,因为我从来没有用过 Obj C :s

I never used Obj C

那你为什么要用一种根本不使用 header 的语言来实现它的 header?

Header!什么是 header?

Header C-like 种语言的文件存储的不仅仅是名称。它们存储常量和宏命令、函数和 class 方法参数以及 return 类型、结构和 class 字段。本质上,header 文件的内容是前向声明。由于需要在多个文件中执行相同的操作 forward-declarations,它们应运而生。

我不知道 Obj-C 中的 header 文件中添加了哪些额外的规则和功能,但您可以在以下链接中大致了解它们的作用:1, 2, 3, 4 最后一个最多spot-on.

当前问题的答案

Lua 是 dynamically-typed 解释性语言。它不进行编译时类型检查,通常,Lua 程序可以而且应该以不需要跨文件的前向声明的方式构建。因此,对于程序员来说,创建和 lua 字节码生成器和解释器都没有有意义的方式来使用 header 文件。

Lua does not have classes 完全没有。您发布的代码是一种语法糖,用于将签名略有不同的函数分配给模仿 class:

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

这里没有声明,只有匿名函数的生成及其对 table 中字段的赋值。程序的其他部分不需要事先知道有关特定字段、变量或函数(存储在变量中)的任何信息(与 C 不同)。

因此,没有声明意味着与实现没有任何区别。您当然可以首先列出 class-table 的字段并对它们进行虚拟分配,但是,同样地,Lua 对这些字段没有用。如果你想给人类提示,最好写一个专门的手册或在实现中添加注释。

Lua 有 situations 需要前向声明来引用局部函数。但是这种情况不会出现在面向 object 的代码中,因为所有方法都是通过引用 object 访问的,并且在第一个 object 创建时, class 本身通常是完全构建的。