Types Haxe lua.表格<;字符串,Int>;:字符串应该是Int
我的问题是haxe不想将下面的代码段编译成lua目标。它抱怨:Types Haxe lua.表格<;字符串,Int>;:字符串应该是Int,types,lua,casting,typeerror,haxe,Types,Lua,Casting,Typeerror,Haxe,我的问题是haxe不想将下面的代码段编译成lua目标。它抱怨: Main.hx:7:字符11-17:字符串应为Int import lua.Table; class Main { static public function my_test(): Table<String, Int> { var t: Table<String, Int> = Table.create(); t["test"] = 1;
Main.hx:7:字符11-17:字符串应为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);
}
}
虽然我期望的是:
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
,而不是封装在抽象中。在,表中。这告诉Haxe,该类型支持使用整数对其进行索引,并且元素类型为B
。它无法指示允许的索引器类型是A
委员会的文件规定:
此接口应仅用于外部。Haxe不支持对类的自定义数组访问。但是,可以对抽象类型实现数组访问
通过这种方式,您不必将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];
}
}
extern类LuaGTable实现ArrayAccess{
}
抽象MyLuaTable(LuaGTable){
内联公共函数new(){
this=untyped uu lua uu({})”;
}
@:arrayAccess
公共内联函数集(k:k,v){
这个[非类型化的k]=v;
}
@:arrayAccess
公共内联函数get(k:k){
返回此[未键入的k];
}
}
使用implements ArrayAccess
必须允许在表达式中使用索引运算符此[untyped k]
。Haxe认为我们正在做的是为索引表达式提供一个整数值。摘要本身提供了K
/V
类型的索引器
我不知道为什么这不是Haxe标准库所采用的方法。您可能会在他们的GitHub存储库中发现或提交一个bug,以开始对此进行讨论。我不认为让表格难以使用是故意的
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];
}
}