我想知道是否有可能告诉Rust编译器两个泛型类型是相同的。
在特定情况下,我有一个泛型方法的trait,我想实现一个与字段具有相同泛型类型的结构,如以下示例所示:
trait Trait {
fn foo<T>(&self, t: T) -> T;
}
struct Struct<T> {
t: T
}
impl<T> Trait for Struct<T> {
fn foo<U>(&self, t: U) {
self.t
}
}
Ofc这里我有一个编译错误,因为它期望U,但有一个T。我该如何处理这个案子?
将泛型移出创建Trait<T>
是不可能的。
您可以使用关联类型:
trait Trait {
type U;
fn foo(&self, t: Self::U) -> Self::U;
}
struct Struct<T> {
t: T
}
impl<T: Copy> Trait for Struct<T> {
type U = T;
fn foo(&self, t: T) -> T {
self.t
}
}
游乐场
PS:我添加了一个额外的T: Copy
,因为T
需要Copy
返回self.t
,因为它是一个共享参考。
fn foo<T>(&self, t: T) -> T;
trait中的意味着方法必须适用于所有T
,并且结构体的字段不可能同时具有所有这些类型!
也就是说,在给定trait和struct定义的情况下,这段代码可以编译:
fn main() {
let x: Struct<i32> = Struct { t: 0 };
let y: &str = x.foo("abc");
let z: [i32; 2] = x.foo([0,0]);
}
显然y
和z
不可能是x.t
(写完答案后,我发现麦克登的评论已经表达了我的观点;如果他问我,我会删除它,但希望这样做更清楚一点,而不需要dyn
)。