在Rust中可以做这样的事情吗?
trait Foo<T> {}
struct A;
struct B;
struct Bar<T: Foo> {
a: T<A>,
b: T<B>
}
字符串
我知道我可以只对Bar
使用两个参数,但我认为必须有更好的方法来实现这一点。
我想实现一个Graph
结构。因为我不能只将节点和边绑定到它们的父生命周期,所以我希望有像Rc
这样的东西。但是,有时可能需要Graph
,可以从多个线程访问。因此,我必须同时使用Rc
和Arc
实现。
这就是Foo
的好处:我为Rc
和Arc
实现了Foo
(Foo
需要Deref
),并使用了一个绑定到Foo
的参数T
。这就是我想要的单线程和多线程使用一个结构。
2条答案
按热度按时间xdnvmnnf1#
您可以使用 * 泛型关联类型 *(GAT)和族模式:
字符串
然后可以定义两个族:
型
并使用它:
型
(Playground)
正如你所看到的,它比人们所希望的要稍微复杂一些:你不能只说
Bar<Vec>
,例如,但必须通过额外的家庭类型。但它有效!有关包含有关该主题的更多一般信息的较旧答案(在GAT存在之前),请单击here。
bbmckpt72#
在某种程度上,Rust * 确实 * 有看起来很像HKT的东西(请参阅Lukas的回答,以了解它们是什么),尽管有一些可以说是笨拙的语法。
首先,您需要为所需的指针类型定义接口,这可以使用泛型trait来完成。举例来说:
字符串
加上一个泛型trait,它定义了一个关联的类型,这是你真正想要的类型,它必须实现你的接口:
型
接下来,我们为我们感兴趣的类型实现该接口:
型
并定义一些实现上述
Param
trait的虚拟类型。这是关键部分;我们可以有一个类型(RcParam
),它为任何T
实现了Param<T>
,包括能够提供一个类型,这意味着我们模拟了一个更高级的类型。型
最后,我们可以使用它:
型
Playground