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

Generics 当两个泛型类型相同时,告诉Rust编译器,generics,rust,Generics,Rust,我想知道是否有可能告诉Rust编译器这两种泛型类型是相同的 在特定情况下,我有一个带有泛型方法的trait,我想实现一个与field具有相同泛型类型的结构,如以下示例所示: trait{ fn foo(&self,t:t)->t; } 结构{ t:t } 结构的impl特征{ fn foo(和self,t:U){ self.t } } 这里我有一个编译器错误,因为它需要U,但有一个T。 我怎么处理这个案子 将泛型移到foo之外创建Trait不是一个选项。您可能会使用关联的类型: trait{

我想知道是否有可能告诉Rust编译器这两种泛型类型是相同的

在特定情况下,我有一个带有泛型方法的trait,我想实现一个与field具有相同泛型类型的结构,如以下示例所示:

trait{
fn foo(&self,t:t)->t;
}
结构{
t:t
}
结构的impl特征{
fn foo(和self,t:U){
self.t
}
}
这里我有一个编译器错误,因为它需要U,但有一个T。 我怎么处理这个案子


将泛型移到foo之外创建
Trait
不是一个选项。

您可能会使用关联的类型:

trait{
U型;
fn foo(&self,t:self::U)->self::U;
}
结构{
t:t
}
结构的impl特征{
U型=T型;
fn foo(&self,t:t)->t{
self.t
}
}

PS:我添加了一个额外的
T:Copy
,因为
T
需要
Copy
才能返回
self.T
,因为它是一个共享引用

fn foo<T>(&self, t: T) -> T;
显然,
y
z
不能是
x.t


(在写下答案后,我发现麦卡顿的评论中已经提到了这一点;如果他提出要求,我会删除它,但希望这样做更清楚一点,而不需要
dyn
)。

但这些声明不一定相同<代码>设s=Struct{t:42};func&sfn func(s:&dyn Trait){s.foo(“非整数”);}的code>必须是合法的。将
特质
设置为泛型或赋予其关联类型是唯一的解决方法。这个问题太广泛,无法得到普遍回答,基本上相当于“我如何在不实现特质的情况下实现此特质?”简单的回答是“你不能”,但你几乎肯定有更具体的需求,如果你能更详细地解释这个问题,我们可能会帮助你。根据OP对“创建
Trait
不是一个选项”的含义,这可能也不好。我认为OP不想要
Trait
,因为它允许一个Trait的多个实现。但是,是的,既然你已经指出了,他也可能不想要关联的类型。好吧,OP没有说为什么OP不想要
Trait
fn main() {
    let x: Struct<i32> = Struct { t: 0 };
    let y: &str = x.foo("abc");
    let z: [i32; 2] = x.foo([0,0]);
}