为什么我们不实现迭代器中的所有函数来实现迭代器?

时间:2016-11-09 21:57:10

标签: iterator rust traits

要在Rust中实现迭代器,我们只需要实现next方法,如in the documentation所述。但是,Iterator特征has many more methods

据我所知,我们需要实现特征的所有方法。例如,这不会编译(playground link):

struct SomeStruct {}

trait SomeTrait {
    fn foo(&self);
    fn bar(&self);
}

impl SomeTrait for SomeStruct {
    fn foo(&self) {
        unimplemented!()
    }
}

fn main() {}

错误很明显:

error[E0046]: not all trait items implemented, missing: `bar`
 --> src/main.rs:8:1
  |
5 |     fn bar(&self);
  |     -------------- `bar` from trait
...
8 | impl SomeTrait for SomeStruct {
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `bar` in implementation

1 个答案:

答案 0 :(得分:8)

因为除Iterator之外的next上的每个方法都有一个default implementation。这些是在特质本身中实现的方法,特征的实现者获得了#34;免费":

struct SomeStruct {}

trait SomeTrait {
    fn foo(&self);

    fn bar(&self) {
        println!("default")
    }
}

impl SomeTrait for SomeStruct {
    fn foo(&self) {
        unimplemented!()
    }
}

fn main() {}

您可以通过the documentation判断特征方法是否具有默认实现:

  

必需的方法

fn next(&mut self) -> Option<Self::Item> 
     

提供方法

fn size_hint(&self) -> (usize, Option<usize>)

请注意,size_hint位于&#34;提供的方法&#34;部分 - 表示存在默认实施。

如果您能够以更有效的方式实施该方法,欢迎您这样做,但请注意它是not possible to call the default implementation if you decide to override it

专门针对Iterator,如果可以的话,实施size_hint是一个好主意,因为这有助于优化collect等方法。