Deux lettres, une seule donnée. Trace le propriétaire.Two names, one value. Trace the owner.
Trois lignes que tout le monde écrit le premier jour. Elles ne compilent pas — et le refus du compilateur, ici, n'est pas un caprice de syntaxe : c'est le modèle entier de Rust qui tient dans un seul let. La possession se transfère, elle ne se duplique pas.Three lines everyone writes on day one. They don't compile — and the compiler's refusal here is no syntactic quibble: it's all of Rust's model fitting inside a single let. Ownership transfers, it does not duplicate.
let a = String::from("hello"); let b = a; // on croit copier a dans b println!("{a}"); // ← et ici, le compilateur refuse
"hello"owns "hello"Le String n'a pas été copié. let b = a a transféré sa possession à b — et a, du coup, ne possède plus rien.The String wasn't copied. let b = a moved its ownership to b — and so a no longer owns anything.
« Qui possède cette donnée — et qu'est-ce que je casse en la passant ailleurs ? » Chaque valeur a, à tout instant, exactement un propriétaire. L'affecter, la passer à une fonction, la retourner : autant de transferts de cette possession unique."Who owns this data — and what do I break by passing it elsewhere?" Every value has, at any instant, exactly one owner. Assigning it, passing it to a function, returning it: each is a transfer of that single ownership.
Tout le reste de Rust — emprunts, lifetimes, Send/Sync, Arc — est une conséquence de cette règle. On ne commence pas par la syntaxe des structs : on commence par un String qu'on croit copier et qu'on a déplacé. Comprends le move, et le borrow checker cesse d'être un adversaire.Everything else in Rust — borrows, lifetimes, Send/Sync, Arc — is a consequence of this rule. We don't start with struct syntax: we start with a String you think you copied and actually moved. Understand the move, and the borrow checker stops being an opponent.