Le Kiosque · Édition d'Apprentissage The Newsstand · Learning Edition

Une seule tension du modèle Rust,
disséquée jusqu'à l'os.
One tension in Rust's model,
dissected to the bone.

Une collection éditoriale pour le développeur qui vient d'un langage à GC et ne veut pas grinder la syntaxe. Un numéro = un mécanisme-clé, disséqué jusqu'à ce que la tension soit nue : quel bug il rend impossible, ce qu'il coûte, et quand ne pas l'employer. On ne se bat plus contre le compilateur — on l'écoute énoncer un théorème. An editorial collection for the developer coming from a GC language who refuses to grind syntax. One issue = one key mechanism, dissected until the tension is bare: which bug it makes impossible, what it costs, and when not to use it. You stop fighting the compiler — you hear it state a theorem.

Progression de lectureReading progress

Rien d'ouvert pour l'instantNothing opened yet

0 / 27 numéros lusissues read

0 / 135 chapitreschapters

CommencerStart Vol. 1 · № 01 Move semantics, ou la valeur qu'on déplaceMove semantics, or the value you move

Suivie dans ce navigateur, sans compte.Tracked in this browser, no account needed.

Libre, sans compte ni paywall — Free, no account, no paywall — soutenir sur Ko-fi ☕support it on Ko-fi ☕

Vol. I La possessionOwnership

Qui possède cette donnée ?Who owns this data? · 3 numérosissues
Vol. 1 · Juin 2026Jun 2026 DisponibleAvailable
№01
Move semantics,
ou la valeur qu'on déplace
Move semantics,
or the value you move

Le code naïf croit copier : let b = a. En Rust, la possession se transfère — a ne possède plus rien, et le réutiliser ne compile pas. Trois lignes, et tout le modèle de Rust tient dedans : un propriétaire, un drop, zéro double-free. Naive code thinks it copies: let b = a. In Rust, ownership transfers — a owns nothing anymore, and reusing it won't compile. Three lines, and all of Rust's model fits inside: one owner, one drop, zero double-free.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●○○○
PossessionMoveTradeoff
Vol. 1 · Juin 2026Jun 2026 DisponibleAvailable
№02
Borrowing,
ou la règle aliasing XOR mutation
Borrowing,
or the aliasing XOR mutation rule

Emprunter (& / &mut) au lieu de céder : regarder une donnée sans la posséder. Et la règle d'or — un seul &mut, ou autant de & qu'on veut, jamais les deux — qui ne contraint pas le langage mais retourne la définition même d'une course de données en interdiction. Borrow (& / &mut) instead of handing over: look at data without owning it. And the golden rule — one &mut, or as many & as you like, never both — which doesn't constrain the language but flips the very definition of a data race into a prohibition.

LectureRead time ≈ 22 min · 5 chap.
NiveauLevel ●○○○
PossessionEmpruntAliasing
Vol. 1 · Juin 2026Jun 2026 DisponibleAvailable
№03
Slices,
ou regarder sans copier ni posséder
Slices,
or looking without copying or owning

&str, &[T] : une fenêtre sur une donnée, sans allocation ni possession. Le réflexe qui désamorce 80 % des combats futurs : prends &str en paramètre là où tu prenais String. &str, &[T]: a window onto data, with no allocation and no ownership. The reflex that defuses 80% of future fights: take &str where you were taking String.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●○○○
PossessionSlicesstr

Vol. II Les lifetimesLifetimes

Cette référence vit-elle assez ?Does this reference live long enough? · 3 numérosissues
Vol. 2 · Juin 2026Jun 2026 DisponibleAvailable
№01
Lifetimes,
ou le temps inscrit dans le type
Lifetimes,
or time written into the type

L'annotation ne rallonge aucune vie : elle relie des durées pour que le compilateur prouve qu'aucune référence ne survit à sa donnée. On part du use-after-free que Rust refuse, pas de la syntaxe. The annotation lengthens no life: it links durations so the compiler can prove no reference outlives its data. We start from the use-after-free Rust refuses, not from syntax.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●○○
LifetimesRéférencesPreuve
Vol. 2 · Juin 2026Jun 2026 DisponibleAvailable
№02
L'élision,
ou pourquoi 90 % des lifetimes ne s'écrivent pas
Elision,
or why 90% of lifetimes go unwritten

Les trois règles que le compilateur applique seul pour deviner les durées de vie — et pourquoi on n'annote que lorsqu'il reste une vraie ambiguïté à lever. The three rules the compiler applies on its own to infer lifetimes — and why you annotate only when a genuine ambiguity remains.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●○○
LifetimesÉlision
Vol. 2 · Juin 2026Jun 2026 DisponibleAvailable
№03
'static & le combat contre le borrow checker 'static & the fight against the borrow checker

Face à une erreur de lifetime, le débutant annote plus fort jusqu'à abandonner. Le bon réflexe : si les lifetimes deviennent ingérables, c'est le design de possession qui est faux. Facing a lifetime error, the beginner annotates harder until they give up. The right reflex: if lifetimes become unmanageable, it's the ownership design that's wrong.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
Lifetimes'staticDesign

Vol. III Le type qui rend l'illégal impossibleTypes that forbid the illegal

Cet état, irreprésentable ?This state, unrepresentable? · 3 numérosissues
Vol. 3 · Juin 2026Jun 2026 DisponibleAvailable
№01
Enums & pattern matching,
ou les sum types
Enums & pattern matching,
or sum types

Modéliser l'une de ces formes, exclusivement — et l'exhaustivité que match impose : le compilateur refuse d'oublier un cas. L'état invalide devient irreprésentable. Model one of these shapes, exclusively — and the exhaustiveness match enforces: the compiler refuses to forget a case. The invalid state becomes unrepresentable.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●○○
TypesEnumsmatch
Vol. 3 · Juin 2026Jun 2026 DisponibleAvailable
№02
Option,
ou l'absence de null
Option,
or the absence of null

Le milliard de dollars qu'on ne paie pas : l'absence devient un cas qu'on DOIT traiter. unwrap et expect ont un prix — on le nomme. The billion-dollar mistake you don't pay: absence becomes a case you MUST handle. unwrap and expect have a price — we name it.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●○○
TypesOptionnull
Vol. 3 · Juin 2026Jun 2026 DisponibleAvailable
№03
Newtype & type-state,
ou l'état illégal qui ne compile pas
Newtype & type-state,
or the illegal state that won't compile

Un Connection<Open> et un Connection<Closed> qui ne sont pas le même type : send() n'existe simplement pas sur une connexion fermée. Contre-exemple : la cérémonie qui coûte plus que le bug. A Connection<Open> and a Connection<Closed> that aren't the same type: send() simply doesn't exist on a closed connection. Counter-example: the ceremony that costs more than the bug.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
TypesType-stateInvariants

Vol. IV L'erreur comme valeurErrors as values

Erreur attendue, ou bug ?Expected error, or bug? · 3 numérosissues
Vol. 4 · Juin 2026Jun 2026 DisponibleAvailable
№01
Result & l'opérateur ?,
ou l'erreur comme valeur
Result & the ? operator,
or the error as a value

L'erreur est dans le type de retour, pas dans un canal parallèle invisible comme l'exception. La distinction qui structure tout : erreur attendue vs bug. The error lives in the return type, not in an invisible parallel channel like the exception. The distinction that structures everything: expected error vs bug.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●○○
ErreursResult?
Vol. 4 · Juin 2026Jun 2026 DisponibleAvailable
№02
Concevoir ses erreurs : thiserror vs anyhow Designing your errors: thiserror vs anyhow

Un type d'erreur qui dit ce qui a échoué — et le choix bibliothèque vs application : enum d'erreur précis et From pour une lib, contexte agrégé pour une app. An error type that says what failed — and the library vs application choice: a precise error enum and From for a lib, aggregated context for an app.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
Erreursthiserroranyhow
Vol. 4 · Juin 2026Jun 2026 DisponibleAvailable
№03
panic,
unwrap & les invariants
panic,
unwrap & invariants

Un invariant brisé est un bug, pas une condition métier — et là, paniquer est correct. Contre-exemple : le unwrap partout pour faire passer le compilateur, l'exception non gérée qui revient. A broken invariant is a bug, not a business condition — and there, panicking is correct. Counter-example: unwrap everywhere to make the compiler pass, the unhandled exception returning.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
ErreurspanicInvariants

Vol. V Les traitsTraits

Statique ou dynamique ?Static or dynamic dispatch? · 3 numérosissues
Vol. 5 · Juin 2026Jun 2026 DisponibleAvailable
№01
Traits & generics,
ou le polymorphisme à coût zéro
Traits & generics,
or zero-cost polymorphism

La monomorphisation : zéro coût à l'exécution, mais du code dupliqué à la compilation. Rust n'a pas d'héritage — et c'est un choix, pas un manque. Monomorphization: zero runtime cost, but duplicated code at compile time. Rust has no inheritance — and that's a choice, not a lack.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
TraitsGenericsMonomorphisation
Vol. 5 · Juin 2026Jun 2026 DisponibleAvailable
№02
Trait objects (dyn),
ou la vtable et son prix
Trait objects (dyn),
or the vtable and its price

Une vtable, un coût d'indirection, échangé contre la flexibilité : mettre des types hétérogènes dans le même Vec. Contre-exemple : Box<dyn> réflexe alors qu'un generic suffisait. A vtable, an indirection cost, traded for flexibility: putting heterogeneous types in the same Vec. Counter-example: reflexive Box<dyn> when a generic would do.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
Traitsdynvtable
Vol. 5 · Juin 2026Jun 2026 DisponibleAvailable
№03
Orphan rule & blanket impls Orphan rule & blanket impls

Pourquoi on ne peut pas tout implémenter partout : la cohérence. Et les patterns autour — le newtype pour contourner l'orphan rule proprement. Why you can't implement everything everywhere: coherence. And the patterns around it — the newtype to work around the orphan rule cleanly.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●●
TraitsCoherenceNewtype

Vol. VI Sortir de l'arbreBeyond the ownership tree

Plusieurs propriétaires — à quel prix ?Many owners — at what cost? · 3 numérosissues
Vol. 6 · Juin 2026Jun 2026 DisponibleAvailable
№01
Box<T>,
ou la possession unique déportée
Box<T>,
or single ownership relocated

Taille connue, types récursifs, possession unique d'une donnée déportée sur le tas. La première échappatoire à l'arbre de possession — la plus simple, la moins chère. Known size, recursive types, single ownership of data relocated to the heap. The first escape from the ownership tree — the simplest, the cheapest.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
Smart pointersBoxTas
Vol. 6 · Juin 2026Jun 2026 DisponibleAvailable
№02
Rc / Arc,
ou le partage par comptage de références
Rc / Arc,
or sharing by reference counting

Plusieurs propriétaires par comptage de références — et les cycles qui fuient : la fuite mémoire que Rust n'empêche pas. Weak comme issue. Multiple owners by reference counting — and the cycles that leak: the memory leak Rust does not prevent. Weak as the way out.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
Smart pointersRcArc
Vol. 6 · Juin 2026Jun 2026 DisponibleAvailable
№03
Cell / RefCell & l'interior mutability Cell / RefCell & interior mutability

Muter à travers un & partagé, au risque d'un panic à l'exécution. Le réflexe paresseux Rc<RefCell> qui réintroduit les bugs que le Vol 1 avait éliminés — un Vec + indices aurait suffi. Mutate through a shared &, at the risk of a runtime panic. The lazy Rc<RefCell> reflex that reintroduces the bugs Vol 1 eliminated — a Vec + indices would have sufficed.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●●
Smart pointersRefCellInterior mutability

Vol. VII La concurrence sans peurFearless concurrency

Send / Sync l'autorisent-ils ?Do Send / Sync allow it? · 3 numérosissues
Vol. 7 · Juin 2026Jun 2026 DisponibleAvailable
№01
Threads & closures move Threads & move closures

Le move qui dit cette donnée part avec toi : transférer la possession dans un thread. La même règle aliasing XOR mutation, appliquée aux threads — et le thread scopé qui prête au lieu de déplacer. The move that says this data leaves with you: transferring ownership into a thread. The same aliasing XOR mutation rule, applied to threads — and the scoped thread that lends instead of moving.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
ConcurrenceThreadsmove
Vol. 7 · Juin 2026Jun 2026 DisponibleAvailable
№02
Send,
Sync & Arc<Mutex<T>>
Send,
Sync & Arc<Mutex<T>>

Arc pour partager la possession entre threads, Mutex pour rétablir l'exclusivité — ni l'un ni l'autre ne suffit seul. Et le rappel honnête : Rust empêche le data race, pas le deadlock. Arc to share ownership across threads, Mutex to restore exclusivity — neither alone is enough. And the honest reminder: Rust prevents the data race, not the deadlock.

LectureRead time ≈ 19 min · 5 chap.
NiveauLevel ●●●●
ConcurrenceSendMutex
Vol. 7 · Juin 2026Jun 2026 DisponibleAvailable
№03
Les canaux,
ou share memory by communicating
Channels,
or share memory by communicating

Passer des messages plutôt que partager de la mémoire : la possession transférée par le canal. Plus rien à partager, donc plus de course — par construction, pas par verrou. Pass messages rather than share memory: ownership transferred through the channel. Nothing left to share, hence no race — by construction, not by lock.

LectureRead time ≈ 19 min · 5 chap.
NiveauLevel ●●●○
ConcurrenceCanauxmpsc

Vol. VIII AsyncAsync

Parallélisme, ou attendre sans bloquer ?Parallelism, or non-blocking wait? · 3 numérosissues
Vol. 8 · Juin 2026Jun 2026 DisponibleAvailable
№01
Future & .await,
ou le calcul qui ne se lance pas
Future & .await,
or the computation that doesn't start

Un Future décrit un calcul, il ne le lance pas : non-await, il est inerte. Casser l'analogie avec la promesse JS qui part dès sa création — un bug silencieux fréquent. A Future describes a computation, it doesn't start it: un-awaited, it is inert. Breaking the analogy with the JS promise that fires on creation — a frequent silent bug.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●●
AsyncFutureawait
Vol. 8 · Juin 2026Jun 2026 DisponibleAvailable
№02
Le problème des fonctions colorées The colored functions problem

async contamine la signature de tout ce qui l'appelle — et la donnée tenue à travers un .await doit être Send. Le Vol 7 ressurgit en plein async. async contaminates the signature of everything that calls it — and data held across a .await must be Send. Vol 7 resurfaces mid-async.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●●
AsyncColoringSend
Vol. 8 · Juin 2026Jun 2026 DisponibleAvailable
№03
Annuler,
sélectionner,
structurer
Cancel,
select,
structure

.await est un point d'annulation : select! garde le premier prêt et lâche les autres, drop annule une tâche. La cancellation safety qu'on oublie jusqu'à ce qu'elle morde. .await is a cancellation point: select! keeps the first ready and drops the rest, drop cancels a task. The cancellation safety you forget until it bites.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●●
AsyncselectCancellation

Vol. IX Le coût réel & l'échappatoireReal cost & the escape hatch

Connais-tu le coût, ou l'imagines-tu ?Do you know the cost, or guess it? · 3 numérosissues
Vol. 9 · Juin 2026Jun 2026 DisponibleAvailable
№01
Itérateurs & abstractions zéro-coût Iterators & zero-cost abstractions

La chaîne .iter().map().filter().collect() compile vers la même boucle qu'à la main — lisibilité sans surcoût, le zero-cost prouvé plutôt que promis. The .iter().map().filter().collect() chain compiles to the same loop as by hand — readability without overhead, zero-cost proven rather than promised.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
CoûtItérateursZero-cost
Vol. 9 · Juin 2026Jun 2026 DisponibleAvailable
№02
clone,
Cow & l'allocation cachée
clone,
Cow & the hidden allocation

Le .clone() pour faire taire le compilateur cache une allocation — souvent un emprunt qu'on n'a pas su écrire. Cow n'alloue que si l'on mute vraiment. The .clone() to silence the compiler hides an allocation — often a borrow you couldn't express. Cow allocates only if you actually mutate.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
CoûtCowclone
Vol. 9 · Juin 2026Jun 2026 DisponibleAvailable
№03
unsafe & FFI,
ou le dernier recours encapsulé
unsafe & FFI,
or the encapsulated last resort

unsafe ne désactive pas les règles de Rust : il transfère leur preuve du compilateur vers toi. Le dernier recours, encapsulé derrière une API sûre — pas le réflexe pour contourner un combat de borrow checker. unsafe does not disable Rust's rules: it transfers their proof from the compiler to you. The last resort, encapsulated behind a safe API — not the reflex to dodge a borrow checker fight.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●●
CoûtunsafeFFI
Mot de l'éditeurFrom the editor

Pas une syntaxe. Un modèle. Not a syntax. A model.

Le piège, en apprenant Rust, c'est de se battre contre le compilateur — de mémoriser les incantations qui « font passer le borrow checker » sans comprendre ce qu'il prouve. Chaque numéro dissèque une seule tension : possession, durée de vie, type, coût. Le bug qu'on n'aura pas d'abord, le prix ensuite, et le contre-exemple — quand ne pas l'employer. The trap, learning Rust, is fighting the compiler — memorizing the incantations that 'make the borrow checker pass' without grasping what it proves. Each issue dissects a single tension: ownership, lifetime, type, cost. The bug you won't have first, the price next, and the counter-example — when not to use it.

La règle tacite : en Rust, on ne débugge pas à l'exécution ce qu'on peut rendre impossible à la compilation. Le compilateur n'est pas un gardien tatillon ; c'est un système de preuve, et chacun de ses refus est un théorème qu'on n'a pas encore su énoncer. The unspoken rule: in Rust, you don't debug at runtime what you can make impossible at compile time. The compiler isn't a fussy gatekeeper; it's a proof system, and every refusal is a theorem you haven't yet learned to state.