2015-02-07 32 views
1

我不能想出一個辦法,使這個代碼編譯--cfg on_trait性狀與默認的方法依賴於綁定的相關類型的

trait DigitCollection: Sized { 
    type Iter: Iterator<Item = u8>; 
    fn digit_iter(self) -> Self::Iter; 

    #[cfg(on_trait)] 
    fn digit_sum(self) -> u32 { 
     self.digit_iter() 
      .map(|digit: u8| digit as u32) 
      .fold(0, |sum, digit| sum + digit) 
    } 
} 

#[cfg(not(on_trait))] 
fn digit_sum<T: DigitCollection>(collection: T) -> u32 { 
    collection.digit_iter() 
     .map(|digit: u8| digit as u32) 
     .fold(0, |sum, digit| sum + digit) 
} 

fn main() { 
} 

隨着on_trait這種失敗:

trait.rs:7:14: 7:26 error: type annotations required: cannot resolve `<<Self as DigitCollection>::Iter as core::iter::Iterator>::Item == u8` [E0284] 
trait.rs:7   self.digit_iter() 
         ^~~~~~~~~~~~ 
error: aborting due to previous error 

沒有on_trait,它編譯得很好。請注意0​​變體只是因爲它是一個自由函數而不是默認方法。


編輯:我開了這個問題:rust-lang/rust#22036

+3

還有一些在相關類型的孔裏的東西,應該是合法的不要編譯。這看起來像是其中之一。 – 2015-02-07 01:31:17

+2

順便提一下,'fn digit_iter(self) - > Self :: Iter;'可以工作,不需要''。 – 2015-02-07 01:31:46

+0

感謝您的建議!如果這個問題不是已知的問題,我會開一個問題(我無法找到任何未解決的問題) – 2015-02-07 01:50:23

回答

0

此代碼現在編譯如下期望:

trait DigitCollection: Sized { 
    type Iter: Iterator<Item = u8>; 
    fn digit_iter(self) -> Self::Iter; 

    fn digit_sum(self) -> u32 { 
     self.digit_iter() 
      .map(|digit: u8| digit as u32) 
      .fold(0, |sum, digit| sum + digit) 
    } 
} 

fn main() {}