gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:56:41 29 4
gpt4 key购买 nike

要在 Rust 中实现迭代器,我们只需要实现 next 方法,如 in the documentation 所解释的那样.但是,Iterator 特征 has many more methods .

据我所知,我们需要实现一个trait的所有方法。例如,这不会编译(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

最佳答案

因为 Iterator 上的每个方法除了 next有一个default implementation .这些是在特征本身中实现的方法,特征的实现者“免费”获得它们:

struct SomeStruct {}

trait SomeTrait {
fn foo(&self);

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

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

fn main() {}

你可以通过 the documentation 判断一个 trait 方法是否有默认实现。 :

Required methods

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

Provided methods

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

请注意 size_hint位于“提供的方法”部分 — 这表明存在默认实现。

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

专用于Iterator , 实现 size_hint 是个好主意如果可以的话,因为这可以帮助优化像 collect 这样的方法.

关于iterator - 为什么我们不实现 Iterator 中的所有函数来实现一个迭代器呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40516692/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com