Variables et types de base
Lier une variable
En Rust, on ne déclare pas à proprement parler les variables, mais on
les associe à une valeur avec le mot clef let
. La ligne suivante
crée une variable a
qui va être liée à la valeur 3:
fn main() { let a = 3; println!("La valeur de a est {a}."); }
Le type de a
va être inféré par rapport à la valeur du litéral,
ici un entier signé sur 32 bits (i32
). On aurait pu également donner
le type de manière explicite à la variable de la manière suivante:
fn main() { let a:i64 = 3; println!("La valeur de a est {a}."); }
En Rust, une instruction let
n'est pas une expression (à la différence de C/C++ ou l'affectation renvoie une valeur).
Types de données scalaires
Rust a les types scalaires classiques entiers, flottants, booléens et caractères.
Entiers (integers)
Les entiers sont les suivants:
Length | Signed | Unsigned |
---|---|---|
8-bit | i8 | u8 |
16-bit | i16 | u16 |
32-bit | i32 | u32 |
64-bit | i64 | u64 |
128-bit | i128 | u128 |
arch | isize | usize |
Les entiers litéraux peuvent être définis avec les syntaxes suivantes:
Number literals | Example |
---|---|
Decimal | 98_222 |
Hex | 0xff |
Octal | 0o77 |
Binary | 0b1111_0000 |
Byte (u8 only) | b'A' |
Un entier litéral sera par défaut en 32 bits (i32
).
Flottants
Rust propose des flottants suivant le standard IEEE-754: simple
précision f32
et double précision f64
. Un litéral de type flottant
comme 2.0
sera par défaut en double précision.
fn main() { let x = 2.0; // f64 let y: f32 = 3.0; // f32 }
Booléens
Le type booléen (bool
) supporte les deux valeurs littérales true
et false
.
fn main() { let t = true; let f: bool = false; // with explicit type annotation }
Caractères
Les caractères en Rust sont sur quatre octets et contiennent des valeurs Unicode scalaires.
fn main() { let c = 'z'; let z: char = 'ℤ'; // with explicit type annotation let heart_eyed_cat = '😻'; }
Opérations
fn main() { // addition let sum = 5 + 10; // subtraction let difference = 95.5 - 4.3; // multiplication let product = 4 * 30; // division let quotient = 56.7 / 32.2; let truncated = -5 / 3; // Results is -1 println!("Truncated = {truncated}"); // remainder let remainder = 43 % 5; }
Synthèse
fn print_type_of<T>(_: &T) { println!("{}", std::any::type_name::<T>()) } fn main() { // Variables can be type annotated. let logical: bool = true; let a_float: f64 = 1.0; // Regular annotation let an_integer = 5i32; // Suffix annotation // Or a default will be used. let default_float = 3.0; // `f64` let default_integer = 7; // `i32` let a = 'a'; let alpha = 'α'; let inf = '∞'; let z: char = 'ℤ'; let heart_eyed_cat = '😻'; // A type can also be inferred from context let mut inferred_type = 12; // Type i64 is inferred from another line inferred_type = 4294967296i64; print_type_of(&inferred_type); }