【问题标题】:Calling Lua static functions from Haxe code从 Haxe 代码调用 Lua 静态函数
【发布时间】: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);
}

【问题讨论】:

    标签: lua haxe


    【解决方案1】:

    确实,您可以在外部使用 @: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。不知道它是如何更新或完成的。在这里,setColor() 似乎被定义为GraphicsModule.setColor()(在love.graphics 包中)。

    【讨论】:

    • 感谢您的帮助,这看起来应该可以解决我所有的问题!
    • 如果可能的话,我认为最简单的方法是使用现有的外部变量。它们甚至似乎是从官方 API 自动生成的:github.com/bartbes/love-haxe-wrappergen
    猜你喜欢
    • 2013-07-28
    • 1970-01-01
    • 2019-12-10
    • 2015-08-10
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多