哈克塞路亚。表<字符串,整数>:字符串应为国际



我的问题是haxe不想将下面的代码片段编译为lua目标。投诉内容如下:Main.hx:7: characters 11-17 : String should be Int

import lua.Table;
class Main {
static public function my_test(): Table<String, Int>
{
var t: Table<String, Int> = Table.create();
t["test"] = 1; # Heres the problem
return t;
}
static public function main(): Void
{
var x = my_test();
trace(x);
}
}

如果我把有问题的行改为:t[1] = 1;奇怪的是它没有抱怨,这对我来说似乎不符合逻辑,因为在我的理解中它是一个错误的类型。

如果我把$type(t)放到上面代码片段的某个地方,它会正确地识别它为lua.Table<String, Int>

我查看了std/lua/Table.hx的源代码,并基于那里的一些代码,我在我的代码片段中使用了untyped关键字:t[untyped "test"] = 1;只有这样它才能生成成功执行的所需lua代码:

Main.my_test = function()
local t = ({});
t.test = 1;
do return t end;
end

虽然我期望的是:

Main.my_test = function()
local t = {};
t["test"] = 1;
do return t end;
end

那么,为什么我必须使用这个关键字呢?

$ haxe --version
4.2.1+bf9ff69
# I compile with
$ haxe -D lua-vanilla --main Main --lua Main.lua

这似乎是Haxe的限制,以及如何将外部库定义为extern而不是包装在抽象中。在性病/lua表。hx中,Table<A, B>被定义为实现ArrayAccess<B>。这告诉Haxe该类型支持用整数对其进行索引,并且元素类型为B。它没有办法表明允许的索引器类型是AArrayAccess<T>的文档说明:

此接口应仅用于extern。Haxe不支持对类的自定义数组访问。但是,可以为抽象类型实现数组访问。

https://haxe.org/manual/types-abstract-array-access.html

以这种方式将lua.Table定义为简单的extern,您可以将其定义为抽象的包装器。这将允许你适当地指定数组setter/getter。下面是这样做的一个例子:

extern class LuaGTable<A, B> implements ArrayAccess<B> {
}
abstract MyLuaTable<K, V>(LuaGTable<K, V>) {
inline public function new() {
this = untyped __lua__("({})");
}
@:arrayAccess
public inline function set(k: K, v) {
this[untyped k] = v;
}
@:arrayAccess
public inline function get(k: K) {
return this[untyped k];
}
}

必须使用implements ArrayAccess<B>才能允许在表达式this[untyped k]中使用索引操作符。Haxe认为我们所做的是为索引表达式提供一个整数值。摘要本身提供K/V类型的索引器。

为什么这不是Haxe标准库所采取的方法是我不知道的。你可能会在他们的GitHub存储库中找到或提交一个bug来开始讨论这个问题。我不认为让Table<A, B>难以使用是故意的。

最新更新