Mam funkcję, która wygląda tak:Modyfikowanie `iter` łańcuch użycie` and_then` itp
type Attributes = HashMap<String, json::Json>;
type Store = Arc<RwLock<HashMap<String, RwLock<Attributes>>>>;
fn get(store: &Store, key: &str) -> Option<Attributes> {
store.read().iter()
.filter_map(|g| (*g).get(key))
.filter_map(|v| v.read().ok())
.map(|v| (*v).clone())
.next()
}
To kompiluje i działa dobrze. Jednak dla własnego zbudowania, I zostały próbuje zmodyfikować, aby używać standardowych Result
/Option
metod (bez konwersji LockResult
do Iter
), coś takiego:
store.read().ok()
.and_then(|g| (*g).get(key))
.and_then(|v| v.read().ok())
.map(|v| (*v).clone());
Ale to mówi mi, że g does not live long enough
. Próbowałem dodawać ref
i as_ref
w różnych miejscach, ale nie mogę go skompilować. czego mi brakuje?
wiem, że mogę zmusić go do pracy jak:
store.read().ok()
.and_then(|g| {
(*g).get(key)
.and_then(|v| v.read().ok())
.map(|v| (*v).clone())
})
Ale chciałbym, aby móc łańcucha nim jak w przypadku iter
.
(Potencjalnie noob pytanie) Czy to nie jest różnica między 'iter()' i 'into_iter()'? Możesz użyć 'do_iter()', aby przenieść własność na resztę łańcucha, tak aby twoje referencje żyły w całym tekście? –
@ SimonWhitehead, dzięki za komentarz! Tak, myślę, że to jest dokładnie różnica między 'iter' i' into_iter' - ale w odwrotnej kolejności. Ja ** chcę używać 'iter' zamiast' into_iter', a właściwie chcę wariantu 'and_then', który robi coś takiego jak' iter', ale nie mogę znaleźć odpowiedniego kombinacja 'as_ref' itp., który to robi. Kiedy zmieniam pierwszy przykład powyżej, aby użyć 'into_iter', otrzymuję te same komunikaty o błędach, co mój drugi przykład. –
Nie przypuszczam, że moglibyście połączyć MVCE w kojec dla mnie/innych, aby mogli się nimi zajmować? –