Bonjour,
J’en avait un peu marre de suivre le book, j’ai donc décidé de prendre une petite pause en me lançant un défi avec Rust, le Javaquarium (dans mon cas : Rusted Tank).
Jusqu’à l’étape où il faut que les poissons mangent, je n’avais pas de problème. Je pense m’être bien débrouillé avec les références et tout ça. Le code ce trouve sur Github. Bon maintenant il faut que mes poissons puissent manger. Et là je bloque totalement puisque j’ai besoin d’avoir une référence mutable de mon poisson et de pouvoir le comparer avec les autres poissons d’un vecteur (et donc d’y accéder par référence) ce qui est impossible puisque Rust dit bien dès le départ qu’il ne peut y avoir qu’une seule référence à la fois si celle-ci est mutable. Je vous montre la fonction qui me permet de passer un tour dans mon aquarium :
pub fn next(&mut self) {
self.round += 1;
if !self.fishes.is_empty() {
for fish in &mut self.fishes { // Ici fish est une référence mutable, j'ai besoin de le modifier
if fish.is_alive() {
fish.take_damage(1); // Je le modifie
fish.age(); // Ici aussi
if fish.is_hungry() {
match fish.get_diet() {
Diet::Carnivorous => {
let food = thread_rng().gen_range(0, self.fishes.len()); // len() essaye d'accéder à une référence non mutable de self.fishes, forcément erreur
if &mut self.fishes[food] != fish { // J'ai l'ai mis en référence mutable pour pouvoir comparer avec l'autre fish mais bon, j'ai une erreur...
}
},
Diet::Herbivorous => {
// pick a random seaweed
}
}
}
}
}
}
}
J’ai mis des commentaires pour que vous suiviez et aussi pour que vous me disiez si mon raisonnement est correct.
Bref. J’imagine que c’est la logique de la fonction qui n’est pas bonne, je ne pense bien qu’il y a un moyen de le faire avec Rust, mais je ne vois pas comment…
Merci à vous !