Diagnostics du compilateur Rust
Utilise cette skill pour résoudre les diagnostics du compilateur Rust et Clippy sans deviner.
Workflow
- Exécute la commande la plus ciblée qui reproduit le diagnostic, généralement
cargo check -p <crate>ou un test focalisé. - Lis la première vraie erreur du compilateur avant les erreurs secondaires ; les diagnostics ultérieurs sont souvent des conséquences.
- Identifie la catégorie impliquée : ownership, lifetime, type, trait, macro, feature ou lint.
- Inspecte le site de définition et l'appelant le plus proche avant d'éditer.
- Préfère modifier la forme de l'API seulement quand le contrat actuel est la vraie cause.
- Réexécute la même commande après chaque correction, puis élargis la vérification quand la commande ciblée est clean.
Triage du Borrow Checker
- Trouve qui possède la valeur, qui l'emprunte, et combien de temps chaque emprunt doit réellement vivre.
- Réduis la portée d'emprunt avec des blocs, des variables locales, ou une extraction plus tôt avant d'ajouter des clones.
- Sépare les données immutables de l'état mutable quand un grand struct emprunté bloque l'accès indépendant.
- Déplace le travail coûteux ou faillible en dehors des lock guards et des emprunts mutables.
- Utilise des valeurs possédées pour les tâches spawned et le travail cross-thread ; les références s'adaptent rarement à ces lifetimes.
Exemples de réparation de diagnostic
Terminer un emprunt avant une mutation
// Évite : `self.items` est emprunté immutablement pendant la mutation de `self`.
if let Some(item) = self.items.get(id) {
self.record_access(item.name());
}
// Préfère : extrais la valeur possédée nécessaire, en terminant l'emprunt.
let name = self.items.get(id).map(|item| item.name().to_owned());
if let Some(name) = name {
self.record_access(&name);
}
Extraire un champ en toute sécurité
if let Some(task) = self.pending_task.take() {
task.cancel().await;
}
Utilise Option::take quand un champ doit être extrait tout en laissant la struct dans un état valide.
Corriger un emprunt qui s'échappe dans les tâches spawned
// Évite : `&self` ne peut pas être déplacé dans une tâche 'static.
tokio::spawn(async move {
self.refresh().await;
});
// Préfère : clone le handle possédé nécessaire pour la tâche.
let client = self.client.clone();
tokio::spawn(async move {
client.refresh().await;
});
Triage Clippy
- Traite Clippy comme du feedback de conception, pas seulement du feedback de style.
- Accepte les suggestions de Clippy quand elles préservent la lisibilité et le comportement.
- Ajoute
#[allow(...)]seulement près de la plus petite portée et inclus une courte raison quand le lint est intentionnellement violé. - Ne silence pas
unwrap_used,expect_used,panic, ou les lints de conversion avec perte dans les chemins de production sans confirmer la politique du projet.
Préfère les allows ciblés
#[allow(clippy::too_many_arguments, reason = "constructor mirrors the wire protocol fields")]
pub fn from_wire(/* fields */) -> Self {
// ...
}
Références
Lis references/error-triage.md pour les familles de diagnostics communes et les patterns de réparation.