要在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
答案 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
等方法。