5. Types et valeurs
5. Types et valeurs
Les types sont une forme de documentation exĂ©cutable. Dans Vitte, ils servent Ă exprimer vos contraintes, pas Ă vous piĂ©ger. Un bon type est une phrase courte : il dit ce que la valeur est, pas seulement ce quâelle contient.
Types numériques
On retrouve des types entiers classiques (i32, u64) et des flottants. Le but est dâĂȘtre explicite sur la taille et le signe. Ce dĂ©tail est vital dans le code systĂšme : un mauvais type est une corruption silencieuse.
Inférence raisonnable
Vitte infĂšre quand câest sans ambiguĂŻtĂ©. Quand le doute existe, vous devez prĂ©ciser. Câest un compromis qui Ă©vite les surprises dans un code longâvivant.
Types composés
Vous manipulerez souvent des slices, des buffers, et des structures. Le langage fournit des briques simples pour exprimer ces formes. On verra les structures en détail au chapitre 8.
Types comme vocabulaire
Nommez vos types comme vous nommez vos fonctions. Un type bien nommĂ© rĂ©duit le besoin de commentaires et clarifie lâintention. On prĂ©fĂšre souvent un petit type dĂ©diĂ© Ă un alias gĂ©nĂ©rique qui ne raconte rien.
Les erreurs de type sont des informations
Une erreur de type est un message, pas un affront. Elle vous dit que votre modĂšle mental ne correspond pas au contrat du code. Lisezâla comme un dialogue.
Choisir un type, câest choisir un futur
Un type trop large laisse passer trop dâĂ©tats invalides. Un type trop strict ralentit lâexploration. Cherchez lâĂ©quilibre : le type doit exprimer lâinvariant le plus important.
Ă retenir
Le type est un contrat. Quand vous doutez, Ă©crivez le type explicitement. Les types racontent une histoire : Ă©crivezâles pour des lecteurs.
Exemple guidé : types explicites
Ăcrivez une fonction qui lit une taille, puis qui alloue un buffer. Ăcrivezâla dâabord avec types implicites, puis avec types explicites. Comparez la lisibilitĂ©.
Erreurs courantes
Utiliser un type signĂ© pour une taille. Confondre i32 et u32 dans une API publique. Laisser lâinfĂ©rence masquer un choix important.
Checklist types
Les tailles sont non signées. Les identifiants publics ont des types explicites. Les conversions sont visibles.
Exercice : le bon type au bon endroit
Ăcrivez une fonction read_bytes(count).
Version A : count est signé. Version B : count est non signé.
Comparez la clarté des erreurs possibles. Le bon type évite des états invalides.
Code complet (API actuelle)
proc read_bytes(count: usize) -> [u8] {
let out: [u8] = []
let i: usize = 0
loop {
if i >= count { break }
set out = out.push(0 as u8)
i = i + 1
}
give out
}
API idéale (future)
Un constructeur bytes.alloc(count) éviterait la boucle manuelle.