Поскольку collection
является BTreeMap
и не имеет .drain()
или .retain
, и вы можете очистить дерево во время обработки, вам нужно будет удалить дерево из self.collection
манипулируйте им так, как вы хотите, а затем положите обратно.
Как вы уже видели, Rust не позволяет этого с простым присваиванием, потому что если бы была паника во время выполнения вашего фрагмента, self.collection
остался бы в несогласованном состоянии. Вместо этого вам нужно сделать это явно, используя std::mem::replace
, что позволяет вам взять на себя ответственность за содержимое в изменяемой ссылке, предоставляя ему замену, поэтому ссылка продолжает указывать на действительные данные.
fn some_method(&mut self) {
self.collection = std::mem::replace(&mut self.collection, BTreeMap::new())
.into_iter()
.filter(|_| true)
.collect();
}