La spirale : annoter plus fort, jusqu'à 'static, jusqu'à abandonner.The spiral: annotate harder, up to 'static, until you give up.
Le numéro précédent a donné les trois règles d'élision et le moyen d'écrire une annotation juste. Mais il existe un point au-delà duquel annoter ne corrige plus rien — où chaque 'a ajouté déplace l'erreur sans la résoudre. Le débutant y répond en annotant plus fort, jusqu'au coup de désespoir : coller 'static partout. C'est presque toujours le mauvais geste, et il dit quelque chose de précis — le problème n'est pas dans les durées, il est dans la possession.The previous issue gave the three elision rules and how to write a correct annotation. But there's a point beyond which annotating fixes nothing — where each added 'a moves the error without resolving it. The beginner responds by annotating harder, up to the act of despair: slapping 'static everywhere. It's almost always the wrong move, and it says something precise — the problem isn't in the durations, it's in ownership.
fn dernier<'a>(v: &'a Vec<&'a str>) -> &'a str { /* ... */ } // erreur ailleurs → on ajoute une durée fn dernier<'a, 'b>(v: &'a Vec<&'b str>) -> &'b str { /* ... */ } // erreur encore → on lie les deux fn dernier<'a, 'b: 'a>(v: &'a Vec<&'b str>) -> &'b str { /* ... */ } // erreur toujours → le réflexe fatal : fn dernier(v: &Vec<&'static str>) -> &'static str { /* ... */ } // ^^^^^^^ « vit pour toujours » — la fausse sortie
'static n'est pas un mot magique pour « faire taire l'erreur » : c'est la durée la plus longue possible — la donnée vit jusqu'à la fin du programme. L'exiger dans une signature, c'est imposer à l'appelant de ne fournir que des données éternelles (littéraux, fuites mémoire, constantes). On ne lève pas la contrainte : on la durcit à l'extrême, et on la repousse sur tous ceux qui appellent.'static isn't a magic word for 'silence the error': it's the longest possible duration — the data lives until the program ends. Demanding it in a signature forces the caller to supply only eternal data (literals, leaks, constants). You don't lift the constraint: you harden it to the extreme, and push it onto everyone who calls you.
« Mes annotations deviennent-elles ingérables ? » Si oui, arrête d'annoter. Une signature qui croule sous les 'a: 'b n'est pas un problème de syntaxe : c'est un diagnostic. Elle dit qu'une structure tente de tenir des références qu'elle devrait posséder. Le remède est en amont, dans le design.'Are my annotations becoming unmanageable?' If so, stop annotating. A signature buckling under 'a: 'b isn't a syntax problem: it's a diagnosis. It says a structure is trying to hold references it ought to own. The cure is upstream, in the design.
Comme borne de durée sur une référence (&'static str), 'static dit « cette référence est valide pour toujours ». Comme borne sur un type générique (T: 'static), il dit « ce type ne contient aucune référence empruntée à durée courte » — un sens subtilement différent qu'on recroisera au Vol 7 avec les threads. Ici, c'est le premier sens, le piège, qui nous occupe.As a lifetime bound on a reference (&'static str), 'static says 'this reference is valid forever'. As a bound on a generic type (T: 'static), it says 'this type holds no short-lived borrowed reference' — a subtly different meaning we'll meet again in Vol 7 with threads. Here it's the first meaning, the trap, that concerns us.