Я пытаюсь реализовать итератор в своей собственной структуре. Мой общий подход заключается в создании и сохранении итератора при первом вызове next
, а затем при вызове этого итератора каждый раз, когда мне нужно значение.Попытка реализовать итератор: не может вывести соответствующий срок службы из-за противоречивых требований.
Мой пример минимальный недостаток looks like this, и сердце его является:
if !self.vals.is_some() {
self.vals = Some(Box::new({
self.display.chars().filter(|&i| i == self.look_for)
}) as Box<std::iter::Iterator<Item = _>>);
}
Мой код не компилировать, производя следующее сообщение:
help: consider using an explicit lifetime parameter as shown: fn next(self: &'a mut Self) -> Option<<Self>::Item>
Этот совет не помогает (просто приводит к более компиляционным ошибкам, говорящим о том, что моя реализация несовместима с определением признака Iterator.
Буду признателен за понимание у меня все получится, и как я могу это исправить.
'! Self.vals.is_some()' => 'self.vals.is_none()' и некоторая 'map' на последней строке также сделает его еще красивее. – Shepmaster
Это начинает иметь смысл-спасибо за подробный ответ! Но у меня, похоже, есть проблемы с обобщением этого подхода: мой реальный сценарий больше похож на https://play.rust-lang.org/?gist=c43e28b29426cbc50982242f222599f8&version=nightly&backtrace=0, где я не просто хватаю поле, но * вызываю функция на себя, которая возвращает (значение, полученное из) поля. Есть ли подход, который работает в этой ситуации? – Bosh
@Bosh: Если вы удаляете '' a' в '& 'self' в' look_for_details', он компилируется. –