Rust 具有依赖于关联类型的绑定的默认方法的特征

Rust 具有依赖于关联类型的绑定的默认方法的特征,rust,associated-types,Rust,Associated Types,我想不出一种方法来使用--cfg on\u 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(|

我想不出一种方法来使用
--cfg on\u 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() {
}
如果不使用_trait上的
,它的编译就很好。请注意,
not(on_trait)
变体的不同之处在于它是一个自由函数,而不是默认方法



编辑:我打开了一个关于此的问题:

此代码现在可以根据需要编译:

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() {}
trait DigitCollection:大小{
Iter型:迭代器;
fn数字iter(self)->self::iter;
fn数字和(自身)->u32{
self.digital_iter()
.map(|位:u8 |位为u32)
.折叠(0,|和,数字|和+数字)
}
}
fn main(){}

在相关类型中仍然存在许多漏洞,这些漏洞本应是合法的,但却无法编译。这看起来像是其中之一。顺便说一句,
fn-digit\u-iter(self)->self::iter有效,无需使用
。感谢您的建议!我将打开一个问题,以防这不是一个已知的问题(我无法找到关于此问题的任何打开的问题)
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() {}