gpt4 book ai didi

lua - 从 Haxe 代码调用 Lua 静态函数

转载 作者:行者123 更新时间:2023-12-05 04:02:54 25 4
gpt4 key购买 nike

简要版

我如何编写 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);
}

最佳答案

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

Indicates that the given extern type instance should have dot-style invocation for methods instead of colon.

这是一个例子:

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 包中)。

关于lua - 从 Haxe 代码调用 Lua 静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54008876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com