gpt4 book ai didi

abstract - 实现 Set

转载 作者:行者123 更新时间:2023-12-04 14:38:17 24 4
gpt4 key购买 nike

我正试图将我的头环绕在 abstract通过实现 Set数据类型,像这样:

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

关于abstract - 实现 Set<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52559193/

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