实施集<T>
Implementing Set<T>
我正在尝试通过实施 Set
数据类型来解决 abstract
问题,如下所示:
abstract Set<T>(Map<T, Bool>) {
public inline function new() {
this = new Map<T, Bool>();
}
public inline function has(item:T):Bool {
return this.exists(item);
}
public inline function add(item:T):Set<T> {
this.set(item, true);
return null;
}
public inline function remove(item:T):Set<T> {
this.remove(item);
return null;
}
public inline function iterator():Iterator<T> {
return this.keys();
}
}
不过,编译器不喜欢这样。它告诉我 Set.hx:8: characters 11-29 : Abstract Map has no @:to function that accepts IMap<util.Set.T, Bool>
我完全不明白这一点,因为如果我将构造函数更改为
public inline function new(val:Map<T, Bool>) {
this = val;
}
然后用var set = new Set(new Map());
实例化,就可以了。
不过,这太恶心了。我希望能够在不公开底层实现的情况下实例化 Sets。最终,我更喜欢带有签名 new(?initial:Iterable<T>)
的构造函数。这可能吗?我误会了什么吗?
问题是目前无法实例化 Map
而不知道它们的键类型(并且因为 Set.T
是一个自由类型参数,所以这不起作用)。然而,由于构造函数是 inline
,因此 T
在调用站点可能是众所周知的。问题是编译器仍然试图生成 Set.new
。您可以通过在其前面加上 @:extern
来避免这种情况。工作示例:https://try.haxe.org/#1D06C
我正在尝试通过实施 Set
数据类型来解决 abstract
问题,如下所示:
abstract Set<T>(Map<T, Bool>) {
public inline function new() {
this = new Map<T, Bool>();
}
public inline function has(item:T):Bool {
return this.exists(item);
}
public inline function add(item:T):Set<T> {
this.set(item, true);
return null;
}
public inline function remove(item:T):Set<T> {
this.remove(item);
return null;
}
public inline function iterator():Iterator<T> {
return this.keys();
}
}
不过,编译器不喜欢这样。它告诉我 Set.hx:8: characters 11-29 : Abstract Map has no @:to function that accepts IMap<util.Set.T, Bool>
我完全不明白这一点,因为如果我将构造函数更改为
public inline function new(val:Map<T, Bool>) {
this = val;
}
然后用var set = new Set(new Map());
实例化,就可以了。
不过,这太恶心了。我希望能够在不公开底层实现的情况下实例化 Sets。最终,我更喜欢带有签名 new(?initial:Iterable<T>)
的构造函数。这可能吗?我误会了什么吗?
问题是目前无法实例化 Map
而不知道它们的键类型(并且因为 Set.T
是一个自由类型参数,所以这不起作用)。然而,由于构造函数是 inline
,因此 T
在调用站点可能是众所周知的。问题是编译器仍然试图生成 Set.new
。您可以通过在其前面加上 @:extern
来避免这种情况。工作示例:https://try.haxe.org/#1D06C