从Haxe代码调用Lua静态函数

内特·CK

信版

我该如何编写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的extern功能可能是这里的答案,但是目前尚无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);
}
Gama11

确实,您可以@:luaDotMethod在外部使用元数据来完成此操作来自haxe --help-metas

指示给定的extern类型实例应该对方法而不是冒号进行点式调用。

这是一个例子:

class Main {
    public static function main() {
        Love.graphics.setColor(0, 0, 0);
    }
}

@:native("love")
extern class Love {
    static var graphics(default, null):Graphics;
}

@:luaDotMethod
extern class Graphics {
    function setColor(r:Int, g:Int, b:Int):Void;
}

这将生成以下Lua代码:

Main.main = function() 
  love.graphics.setColor(0, 0, 0);
end

另外,您可以通过声明setColor()static函数来实现相同目的,从Haxe角度来看,这可能更自然:

class Main {
    public static function main() {
        love.Graphics.setColor(0, 0, 0);
    }
}
package love;

@:native("love.graphics")
extern class Graphics {
    static function setColor(r:Int, g:Int, b:Int):Void;
}

顺便说一句,Haxelib上已经有一个包含Love2D externs的库,名为hx-love2d虽然不确定如何更新或完成。在这里,setColor()似乎被定义为GraphicsModule.setColor()(在一个love.graphics包中)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章