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

3
要在Rust中实现迭代器,我们只需要实现next方法,就像文档中所述的那样。但是,Iterator特征有许多其他方法
据我所知,我们需要实现特征的所有方法。例如,以下代码无法编译(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个回答

8
因为除了next方法外,Iterator上的每个方法都有默认实现。这些方法是在trait本身中实现的,并且trait的实现者可以“免费”获得它们:
struct SomeStruct {}

trait SomeTrait {
    fn foo(&self);

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

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

fn main() {}

通过文档,您可以确定特征方法是否具有默认实现:

Required methods

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

Provided methods

fn size_hint(&self) -> (usize, Option<usize>)
请注意,size_hint在“提供的方法”部分中——这表明有一个默认实现。
如果您能够以更高效的方式实现该方法,则可以这样做,但请注意,如果您决定覆盖它,则无法调用默认实现
特别是对于Iterator,如果您能够实现size_hint,那么这是一个很好的主意,因为它可以帮助优化诸如collect之类的方法。

真不错!最近我在复制粘贴一些代码时,想要有一种方法来为方法提供默认实现。我只是认为这是没有继承就不可能实现的。 - little-dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接