Как уже упоминалось в комментариях, проблема в том, что структуры обычно не могут быть самоссылочными в Rust .Структура Cursor
, которую вы пытаетесь построить, содержит как MutexGuard
, так и итератор, заимствующий MutexGuard
, что невозможно (по уважительным причинам - см. Связанный вопрос).
Самое простое исправление вв этом случае вводится отдельная структура, хранящая MutexGuard
, например,
struct StoreLock<'a> {
guard: RwLockReadGuard<'a, SimpleCollection>,
}
. На Store
мы можем ввести метод, возвращающий StoreLock
fn lock(&self) -> StoreLock {
StoreLock { guard: self.0.read().unwrap() }
}
и StoreLock
может предоставлять действительный метод scan()
(и, возможно, другие, требующие постоянной блокировки):
impl<'a> StoreLock<'a> {
fn scan(&self) -> Cursor {
Cursor { iter: self.guard.iter() }
}
}
Сама структура Cursor
содержит только итератор:
struct Cursor<'a> {
iter: Iter<'a, String, String>,
}
Клиентский код сначала должен получить блокировку, затем получить курсор:
let lock = s.lock();
let cursor = lock.scan();
Это гарантирует, что блокировка живет достаточно долго для завершения сканирования.
Полный код надетская площадка