Je veux prendre une liste chaînée et la peupler avec des instances d'une structure, mais seulement si la liste ne contient pas déjà l'élément que je songe à ajouter.Quelle est la meilleure pratique avec le vérificateur d'emprunt pour inspecter les références mutables?
Je travaille avec des points donc si (3,5) est dans la liste, je ne veux pas ajouter, sinon que je fais.
Mon code actuel:
use std::collections::LinkedList;
struct Location {
x: i32,
y: i32,
}
fn main() {
let mut locations = LinkedList::new();
loop {
let location_set = &mut locations;
// Scanner stuff happens.
if !has_location(location_set, &next_checkpoint_x, &next_checkpoint_y) {
let point = Location {
x: next_checkpoint_x,
y: next_checkpoint_y,
};
locations.push_back(point);
}
}
}
fn has_location(location_list: LinkedList<Location>, target_x: &i32, target_y: &i32) -> bool {
true // Just until I can figure out this mutability stuff
}
Je suis en mesure de le faire fonctionner par ces changements, mais cela me semble mal à.
loop {
if !has_location(&mut locations, &next_checkpoint_x, &next_checkpoint_y) {
// stuff
}
}
fn has_location(location_list: &LinkedList<Location>, target_x: &i32, target_y: &i32) -> bool {
true
}
Je ne veux pas has_location
pour pouvoir muter la liste chaînée, je veux juste qu'il ce soit en mesure d'emprunter afin de pouvoir regarder à l'intérieur de celui-ci. Je ne veux pas avoir à penser à has_location
(ou une fonction similaire) affectant les listes liées qu'il inspecte. C'est pourquoi j'ai créé le location_set
. Je veux quelque chose de se référer à des endroits dans un sens de lecture seule et que pour transmettre à la fonction has_location
et pour ce qui est appelé (lieux) de ne pas être détruit après avoir appelé la fonction has_location
. J'inclus le &
dans le passage des paramètres dans l'appel de la fonction, parce que je ne veux pas que les paramètres passés soient détruits - donc je les veux empruntés?
Est-ce que je suis vouloir quelque chose qui fait sens - si je déclare à l'origine des endroits comme une liste chaînée mutable puis-je passer une version immuable de celui-ci à une fonction d'évaluer?
Ceci est très utile merci. Quelque chose que je ne comprends pas est dans votre exemple, location_set est passé à has_location directement (donc la fonction le possède, non?). Dans mon esprit, cela signifie qu'à la fin de la portée de has_location, location_set devrait être détruit, non? Comment location_set continue d'exister pour être utilisé dans le bloc if? De plus, si location_set est immuable, comment push_back peut-il être ajouté à la fin de la liste, est-ce parce que la fonction contraint l'emprunt mutable à emprunter de manière immutable? Merci! – neogeek23
Voir ma réponse à la fin de la réponse. –