我有一个特质
trait Foo<T> : Iterator<Item=T> {
fn bar(&mut self) -> f64;
}
我希望为所有类型T
,f64
和{{1从逻辑上说它没关系。
我目前有
f64
有没有一种很好的方法来实现这一目标而不重复?
答案 0 :(得分:7)
您可以使用Borrow
特征。如果您查看文档页面中的实现者,前三个是相关的:这意味着f64
,&'a f64
和&'a mut f64
都实现了Borrow<f64>
。您必须对迭代器生成的每个值调用borrow
方法以获取&f64
。
use std::borrow::Borrow;
impl<T> Foo<T::Item> for T
where T: Iterator,
T::Item: Borrow<f64>
{
fn bar(&mut self) -> f64 {
unimplemented!()
}
}
顺便说一下,在特征上定义类型参数并且同时在该类型参数和超级相关类型之间设置约束是没有意义的。类型T
只能有Iterator
的一个实现,因此它只能有Foo
的一个实现,尽管类型参数表明它可以实现许多不同的Foo<T>
特质。因此,Foo
上的类型参数是完全冗余的(您可以使用supertrait的关联类型而不是类型参数)。因此代码看起来应该更像这样:
use std::borrow::Borrow;
trait Foo: Iterator {
fn bar(&mut self) -> f64;
}
impl<T> Foo for T
where T: Iterator,
T::Item: Borrow<f64>
{
fn bar(&mut self) -> f64 {
unimplemented!()
}
}