有没有办法一般地为所有引用类型实现迭代器的特征?

时间:2016-10-12 02:29:56

标签: rust

我有一个特质

trait Foo<T> : Iterator<Item=T> {
    fn bar(&mut self) -> f64;
}

我希望为所有类型Tf64和{{1从逻辑上说它没关系。

我目前有

f64

有没有一种很好的方法来实现这一目标而不重复?

1 个答案:

答案 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!()
    }
}