Мне нужно перебрать ключи, найти значение в HashMap по ключу, возможно, выполнить тяжелые вычисления в найденной структуре в качестве значения (lazy = ›mutate the struct) и вернуть его в кэш в Rust.
Я получаю следующее сообщение об ошибке:
error[E0499]: cannot borrow `*self` as mutable more than once at a time
--> src/main.rs:25:26
|
23 | fn it(&mut self) -> Option<&Box<Calculation>> {
| - let's call the lifetime of this reference `'1`
24 | for key in vec!["1","2","3"] {
25 | let result = self.find(&key.to_owned());
| ^^^^ `*self` was mutably borrowed here in the previous iteration of the loop
...
28 | return result
| ------ returning this value requires that `*self` is borrowed for `'1`
use std::collections::HashMap;
struct Calculation {
value: Option<i32>
}
struct Struct {
items: HashMap<String, Box<Calculation>> // cache
}
impl Struct {
fn find(&mut self, key: &String) -> Option<&Box<Calculation>> {
None // find, create, and/or calculate items
}
fn it(&mut self) -> Option<&Box<Calculation>> {
for key in vec!["1","2","3"] {
let result = self.find(&key.to_owned());
if result.is_some() {
return result
}
}
None
}
}
- Я не могу избежать цикла, так как мне нужно проверить несколько ключей
- Я должен сделать его изменяемым (
self
и структура), так как возможные вычисления меняют его.
Есть ли предложения о том, как изменить дизайн (поскольку Rust заставляет думать немного иначе, что имеет смысл) или как обойти это?
PS. Есть и другие проблемы с кодом, но давайте разберем проблемы и сначала решим эту.