Я пытаюсь написать черту, которая требует внутреннего типа 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, но похожих не было.
Проблема заключается в разрешении части where Self::Iter
(потому что она рекурсивная), где вам действительно нужно ограничить тип:
pub trait SomeIter {
type Iter: Iterator;
}
Это сработало, спасибо. Я добавлял where Self::Iter
, потому что советовал компилятор.
@YakobsSaghatelyan Нет, не так?