gpt4 book ai didi

types - Haxe lua.Table : String should be Int

转载 作者:行者123 更新时间:2023-12-04 08:00:20 27 4
gpt4 key购买 nike

我的问题是 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而不是包裹在摘要中。在 std/lua/Table.hx , Table<A, B>被定义为实现 ArrayAccess<B> .这告诉 Haxe 该类型支持使用整数对其进行索引,并且元素类型为 B .它没有办法表明允许的索引器类型是 A . ArrayAccess<T> 的文档说明:

This interface should be used for externs only. Haxe does not support custom array access on classes. However, array access can be implemented for abstract types.

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 存储库中找到或提交错误以开始对此进行讨论。我不认为制作 Table<A, B>难用是故意的。

关于types - Haxe lua.Table<String, Int> : String should be Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66510738/

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