代码之家  ›  专栏  ›  技术社区  ›  Nate C-K

从haxe代码调用lua静态函数

  •  1
  • Nate C-K  · 技术社区  · 7 年前

    简约版

    如何编写将生成执行静态函数调用的Lua代码而不是使用实例方法调用语法的Haxe代码?

    长版

    我有一个生成lua代码的haxe程序。我正在运行这个Lua代码 LÖVE ,其中运行时使用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);
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Gama11 zzapper    7 年前

    事实上,你可以用 @:luaDotMethod 外部上的元数据。从 haxe --help-metas :

    指示给定的外部类型实例应具有方法的点样式调用,而不是冒号。

    下面是一个例子:

    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 . 但不确定它是如何更新或完成的。在这里, SET COLL() 似乎被定义为 GraphicsModule.setColor() (在A中) love.graphics 包装)。