J'essaie d'apprendre à rouiller, et comme vous pouvez l'imaginer, le vérificateur d'emprunt est mon plus grand adversaire. Donc, voici ma configuration, c'est une sorte de caisse pour le cuirassé de jeu. Le jeu est basé sur la structure Battlefield
, qui se compose de Cell
s. Un Cell
peut faire référence à une Ship
et un Ship
a un vecteur de tous Cell
s il est référencé par, il est donc une lecture seule relation bidirectionnelle.Satisfaire le contrôleur d'emprunt Rust avec des structures
pub struct Battlefield<'a> {
cells: Vec<Vec<Cell<'a>>>,
}
#[derive(Debug, PartialEq)]
pub struct Cell<'a> {
ship: Option<&'a Ship<'a>>
}
#[derive(Debug, PartialEq)]
pub struct Ship<'a> {
length: usize,
cells: Vec<&'a Cell<'a>>,
}
Mon problème est fonction de place_ship
Battlefield
:
impl<'a> Battlefield<'a> {
pub fn place_ship(&mut self,
ship: &'a mut Ship,
x: usize,
y: usize,
orientation: Orientation)
-> PlaceResult {
// check ship placement in bounds
// check affected cells are free
// set cells' ship ref to ship
// add cell refs to ship's cells field
}
}
Il est logique pour moi et je ne pense pas qu'il y ait un problème de propriété ici, mais je me trompe, il semble:
#[cfg(test)]
mod tests {
use super::{Battlefield, X, Y};
use super::Orientation::*;
use super::super::ship::Ship;
#[test]
fn assert_ship_placement_only_in_bounds() {
let mut ship = Ship::new(3);
let mut bf = Battlefield::new();
assert_eq!(Ok(()), bf.place_ship(&mut ship, 0, 0, Horizontal));
assert_eq!(Ok(()), bf.place_ship(&mut ship, 5, 5, Vertical));
}
}
src/battlefield.rs:166:47: 166:51 error: cannot borrow `ship` as mutable more than once at a time [E0499]
src/battlefield.rs:166 assert_eq!(Ok(()), bf.place_ship(&mut ship, 5, 5, Vertical));
^~~~
src/battlefield.rs:165:47: 165:51 note: first mutable borrow occurs here
src/battlefield.rs:165 assert_eq!(Ok(()), bf.place_ship(&mut ship, 0, 0, Horizontal));
^~~~
Je sais que c'est juste un court extrait, mais tout le code est trop pour poster ici. Le project can be found here (build standard avec 'cargo build').
* mais l'ensemble du code est trop important pour publier ici * - je ** garantis ** que vous pouvez rendre le code suffisamment petit pour être publié ici tout en reproduisant la même erreur. Voir [MCVE]. – Shepmaster
Probablement un doublon de http://stackoverflow.com/q/32300132/155423; peut-être http://stackoverflow.com/q/20698384/155423 ou http://stackoverflow.com/q/28833622/155423 ou http://stackoverflow.com/q/29893978/155423. Ou toute question sur l'aliasing mutable. [Comme l'erreur indique] (https://doc.rust-lang.org/error-index.html#E0499), vous ne pouvez pas emprunter ** n'importe quoi ** comme mutable plus d'une fois à la fois. – Shepmaster
"bidirectionnel" - "Je ne pense pas qu'il y ait un problème de propriété" - Il y a toujours un problème de propriété une fois que vous avez des relations bidirectionnelles. –