2016-11-09 18 views
3

Rustでイテレータを実装するには、in the documentationのように、nextメソッドを実装する必要があります。しかし、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` 
    --> <anon>:9:1 
    | 
9 | impl SomeTrait for SomeStruct { 
    |^missing `bar` in implementation 

答えて

7

next除くIterator上のすべてのメソッドなのでdefault methodsです。これらは、特性自体に実装された方法であり、形質の実装は、「無料で」それらを得る:

struct SomeStruct {} 

trait SomeTrait { 
    fn foo(&self); 
    fn bar(&self) { 
     println!("default") 
    } 
} 

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

fn main() {} 

それは少し微妙だが、形質方法は、the documentationてデフォルトであるかどうかあなたが言うことができます。

pub trait Iterator { 
    // ... 
    fn next(&mut self) -> Option<Self::Item>;  
    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などの方法を最適化するのに役立ちます。

+0

本当に素敵です!私は最近、いくつかのコードを貼り付けてコピーし、メソッドのデフォルト実装を持つ方法があるといいと思っていました。私はこれが継承なしでは不可能であると仮定しました。 –