【发布时间】:2019-05-29 06:01:15
【问题描述】:
简要版
如何编写 Haxe 代码来生成进行静态函数调用而不是使用实例方法调用语法的 Lua 代码?
加长版
我有一个生成 Lua 代码的 Haxe 程序。我在LÖVE 上运行这个 Lua 代码,运行时使用 Lua 表作为命名空间公开各种函数。这些函数主要用于以静态方式调用,如下所示:
love.graphics.setColor(r, g, b)
不幸的是,Haxe 的 Lua 代码生成似乎假设所有 Lua 函数调用都在调用实例方法,因此它生成的代码使用 Lua 的方法调用语法,如下所示:
love.graphics:setColor(r, g, b)
我尝试了各种调用此函数的方法。我只找到了一个有效的:
class Love {
static public var graphics: Graphics = new Graphics();
}
class Graphics {
public function new() {}
public function setColor(r: Int, g: Int, b: Int) {
var fn = untyped love.graphics.setColor;
fn(r, g, b);
}
}
我可以像这样在 Haxe 中调用它:
Love.graphics.setColor(r, g, b);
这很好用,但不优雅,所以我想知道是否有更好的方法来做到这一点。我怀疑它也可能有一些微小的性能成本,尽管我并不特别担心,而且 LuaJIT 可能足够聪明,可以在任何情况下优化中间变量。大多数情况下,我只是想要一种更简洁的方式来编写这个包装代码。
似乎 Haxe 的外部功能可能是这里的答案,但目前没有关于如何使用它的 Lua 特定文档,我无法弄清楚如何在这里应用它。
以下是一些不起作用的代码示例(它们生成实例方法调用而不是静态调用):
public function setColor(r: Int, g: Int, b: Int) {
(untyped love.graphics.setColor)(r, g, b);
}
var _setColor = untyped love.graphics.setColor;
public function setColor(r: Int, g: Int, b: Int) {
_setColor (r, g, b);
}
【问题讨论】: