我应该如何在 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 本身通常是完全构建的。
现在我有一个 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:
的 tableKARect.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 本身通常是完全构建的。