要在 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/