Generics 当两个泛型类型相同时,告诉Rust编译器
我想知道是否有可能告诉Rust编译器这两种泛型类型是相同的 在特定情况下,我有一个带有泛型方法的trait,我想实现一个与field具有相同泛型类型的结构,如以下示例所示: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{
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&s带有fn 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]);
}