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
還有一些在相關類型的孔裏的東西,應該是合法的不要編譯。這看起來像是其中之一。 – 2015-02-07 01:31:17
順便提一下,'fn digit_iter(self) - > Self :: Iter;'可以工作,不需要''。 –
2015-02-07 01:31:46
感謝您的建議!如果這個問題不是已知的問題,我會開一個問題(我無法找到任何未解決的問題) – 2015-02-07 01:50:23