Est-il possible d'emprunter des parties d'une struct mutable, et une autre partie comme immuable - si les champs de la struct sont privées.Est-il possible d'emprunter des parties d'une structure comme mutable et d'autres parties comme immuables?
fn main() {
let mut ecs = EntityComponentSystem::new();
for e_id in ecs.get_entities_with_component::<Velocity>().unwrap() {
let components = ecs.get_mut_components(e_id);
...
}
impl EntityComponentSystem {
...
pub fn get_entities_with_component<K: Key>(&self) -> Option<&HashSet<u64>> {
self.entities_with_components.get(&TypeId::of::<K>())
}
pub fn get_mut_components(&mut self, entity_id: u64) -> &mut TypeMap {
let entity = self.entities.get_mut(&entity_id).unwrap();
&mut entity.components
}
}
pub struct EntityComponentSystem {
entities: HashMap<u64, Entity>, <------- I would like to modify this.
entities_with_components: HashMap<TypeId, HashSet<u64>>, <---- while reading from this!
}
Le compilateur me donne:
error[E0502]: cannot borrow `*ecs` as mutable because it is also borrowed as immutable
--> physics.rs:19:26
|
18 | for e_id in ecs.get_entities_with_component::<Velocity>() {
| --- immutable borrow occurs here
19 | let components = ecs.get_mut_components(*e_id);
| ^^^ mutable borrow occurs here
...
26 | }
| - immutable borrow ends here
Qu'est-ce que je ne suis pas saisir, comment le rapport &self
dans get_entities_with_component
est toujours emprunté après que nous avons essentiellement a renvoyé une partie du champ entities_with_components
.
ne doit pas seulement être cette partie empruntée? Y a-t-il un moyen de faire respecter cela?
"Vous ne pouvez emprunter que la structure entière comme immuable ou mutable, il n'y a pas de concept d'en emprunter seulement des parties." Pour être pédant, oui il y a. Vous pouvez faire un emprunt partiel sur une structure, mais cela ne fonctionnera pas pour l'op parce que les champs sont privés. Voici un exemple: https://play.rust-lang.org/?gist=fcfcca700ba238287063143754e15c97&version=stable – Timidger
@Timidger TIL, merci :) –