要在 Rust 中实现迭代器,我们只需要实现next
方法,如所解释的在文档中 https://doc.rust-lang.org/stable/std/iter/#implementing-iterator。但是,那Iterator
trait 还有很多方法 https://doc.rust-lang.org/stable/std/iter/trait.Iterator.html.
据我所知,我们需要实现一个特质的所有方法。例如,这不会编译():
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
except next
has a 默认实现 https://doc.rust-lang.org/stable/book/ch10-02-traits.html#default-implementations。这些是在特征本身中实现的方法,特征的实现者“免费”获得它们:
struct SomeStruct {}
trait SomeTrait {
fn foo(&self);
fn bar(&self) {
println!("default")
}
}
impl SomeTrait for SomeStruct {
fn foo(&self) {
unimplemented!()
}
}
fn main() {}
您可以通过以下方式判断特征方法是否具有默认实现文档 https://doc.rust-lang.org/std/iter/trait.Iterator.html:
所需方法
fn next(&mut self) -> Option<Self::Item>
提供的方法
fn size_hint(&self) -> (usize, Option<usize>)
注意size_hint
位于“提供的方法”部分 - 这表明存在默认实现。
如果您能以更有效的方式实现该方法,欢迎您这样做,但请注意,这是如果您决定覆盖默认实现,则无法调用它 https://stackoverflow.com/questions/31461902/is-it-possible-to-extend-a-default-method-implementation-of-a-trait-in-a-struct.
专门针对Iterator
,这是一个实现的好主意size_hint
如果可以的话,因为这可以帮助优化方法,例如collect
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)