Переполнение, оценивающее требование, Rust Traits

Я пытаюсь написать черту, которая требует внутреннего типа Iter. И Iter должен реализовать Iterator. Я получаю такую ​​ошибку «переполнение при оценке требования <str as SomeTrait>::Iter == _» и не могу понять, чего оно хочет. Может кто поможет разобраться?)

pub trait SomeIter { 
   type Iter where Self::Iter: Iterator;
}

struct NumberIter(u32, u8);

impl Iterator for NumberIter {
    type Item = u8;

    fn next(&mut self) -> Option<Self::Item> {
        if self.1 == 32 || (self.0 >> self.1) == 0 {
            None
        } else {
            let ret = ((self.0 >> self.1) as u8) & 0xFF;
            self.1 += 8;
            Some(ret)
        }
    }
}

impl SomeTrait for str {
    type Iter = NumberIter;
}

Компилятор посоветовал прочитать несколько примеров в https://doc.rust-lang.org/error-index.html#E0275, но похожих не было.

Репро
canton7 28.03.2022 11:52
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
1
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключается в разрешении части where Self::Iter (потому что она рекурсивная), где вам действительно нужно ограничить тип:

pub trait SomeIter { 
   type Iter: Iterator;
}

Детская площадка

Это сработало, спасибо. Я добавлял where Self::Iter, потому что советовал компилятор.

Yakobs Saghatelyan 28.03.2022 11:59

@YakobsSaghatelyan Нет, не так?

canton7 28.03.2022 12:00

Другие вопросы по теме