С одной стороны ... нет, вы не можете заставить итератор возвращать ссылку на значение счетчика.Метод Iterator::next()
возвращает значение, которое не имеет связи времени жизни со значением получателя &mut self
, поэтому мы не можем контролировать время жизни ссылки, которая будет возвращена там.Это потребуется, потому что мы не можем изменить значение, пока оно заимствовано этой ссылкой.Эту проблему лучше объяснить в другом вопросе .
С другой стороны, , здесь возникает реальная проблема:
Если я заменюT
с u32
, тогда я могу просто вернуть Some(self.count)
, но с использованием обобщений это невозможно.
Это только так, потому что u32
реализует Copy
, чтоозначает, что он копируется всякий раз, когда это необходимо.Типы, реализующие Copy
, также реализуют Clone
, что делает примерно то же самое, что и копия, что произошло бы в неуниверсальном контексте.
Таким образом, операции клонирования, которые вы выполняете вэто разумно, так как вы хотите вернуть значение счетчика, все еще имея собственное состояние.Если T
этого счетчика представляет собой примитивное целое число, такое как u32
, клон такой же дешевый, как и копия этого целого числа.
Кроме этого, вы можете добавить ограничение для T
вAddAssign<T>
, так что вы можете использовать оператор +=
для увеличения внутреннего состояния.
impl<T> Iterator for Counter<T> where T: Num + Clone + AddAssign<T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
self.count += T::one();
Some(self.count.clone())
}
}
См. Также: