当两个泛型类型相同时告诉Rust编译器



我想知道是否有可能告诉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]);
}

显然yz不可能是x.t

(写完答案后,我发现麦克登的评论已经表达了我的观点;如果他问我,我会删除它,但希望这样做更清楚一点,而不需要dyn)。

相关内容

最新更新