Entry tags:
итераторы
!markdown
А вот я и дошёл до странной проблемы, которую я не могу понять.
И этот код неправильный, потому что
222 | impl<'a> IntoIterator for Count{
| ^^ unconstrained lifetime parameter
И я не понимаю, почему так. И оно неприятно щекочет где-то в районе type parameters, потому что редактор подсказывает, что на месте IntoIter = надо писать
И я ни черта не понимаю в написанном. Либо это RLS фигню пишет, либо я что-то глубоко не понимаю. Иду пересматривать про итераторы. Что-то я упускаю...
А вот я и дошёл до странной проблемы, которую я не могу понять.
#[derive (Debug)]
struct Count{
from: u32,
to: u32
}
#[derive (Debug)]
struct CountIterator<'a>{
params: &'a Count,
cur: u32
}
impl Count{
pub fn new(from: u32, to: u32) -> Self {
Count{from, to}
}
}
impl<'a> Iterator for CountIterator<'a>{
type Item = u32;
fn next(&mut self) -> Option<Self::Item> {
if self.cur < self.params.to{
self.cur += 1;
Some(self.cur)
}else{
None
}
}
}
impl<'a> IntoIterator for Count{
type Item = u32;
type IntoIter = CountIterator<'a>;
fn into_iter(&'a self) -> Self::IntoIter {
CountIterator{params: self, cur: self.from}
}
}
И этот код неправильный, потому что
222 | impl<'a> IntoIterator for Count{
| ^^ unconstrained lifetime parameter
И я не понимаю, почему так. И оно неприятно щекочет где-то в районе type parameters, потому что редактор подсказывает, что на месте IntoIter = надо писать
type IntoIter: Iterator<Item = Self::Item> = .....;
И я ни черта не понимаю в написанном. Либо это RLS фигню пишет, либо я что-то глубоко не понимаю. Иду пересматривать про итераторы. Что-то я упускаю...

no subject
Вроде в описании ошибки довольно подробно все расписано: https://doc.rust-lang.org/error_codes/E0207.html
Там, собственно, есди посмотреть сигнатуру
IntoIterator::into_iter(self), которая принимаетself, а не&self, который ты назад в виде ссылки не вернешь (метод его сожрал) то понятно, откуда брать лайфтайм - надо IntoIterator для ссылки реализовать:Оно как-бы немного некрасиво в использовании будет, но в принципе - ок:
Естественно, можно что-то типа такого сделать:
no subject
Ага, спасибо. У меня всё равно есть лёкое ощущение непонимания, хоть я час с гаком смотрел crust of rust. Ещё и убийственный синтаксис с 'as' внутри типопараметра добавляет...