par Emmanuel Bosquet @Keksoj
emmanuelbosquet.com/introduction-a-rust
https://github.com/keksoj/introduction-a-rust.git
- Rust est mon premier language
- J'ai été déçu par tout le reste
- En plus d'être biaisé il m'arrive d'être de mauvaise foi
Certaines personnes à Mozilla devaient en avoir marre :
- des runtimes et autres garbage collectors
- des fuites de mémoire en C et C++
Rust a été mis au point pour être performant et memory safe.
- la mémoire est allouée à la création d'une variable
- les fonctions se passent les références en attendant leur tour
- la mémoire est nettoyée quand la variable sort du scope
- le compilateur interdit le code hérétique (pointeurs nuls et autres horreurs)
Si ça compile ça plantera pas !
Le compilateur est votre meilleur ami (et votre pire ennemi).
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup update
Pas besoin de sudo.
fn hello_world() {
// vec! est une macro qui crée un vecteur
let words = vec!["hello", "world", "!"];
for word in words {
println!("{} ", word); // encore une macro
}
}
Mais on ne trouve pas ce genre de Rust dans la nature. Ce qui manque dans cet exemple, c'est…
Tous un tas de nombres, signés, non signés, flottants : i32
, u8
, f64
.
Des String
s en UTF8, il va falloir revoir vos habitudes !
Collections:
- vecteurs (taille variable)
- tableaux (taille fixe)
- tuples (éléments hétéroclites)
Et vos propres types customs :
type mon_type_de_tableau_perso = [u16; 5];
Le type qui vous laisse choisir.
pub enum TypeDePokemon {
Herbe,
Feu,
Eau,
Vol,
Normal,
Poison,
Electrique,
}
Le type qui :
- soit contient une valeur =>
Some(valeur)
- soit ne contient rien =>
None
type EvolueEn = Option<String>;
Un Pokemon peut soit :
- évoluer dans un autre pokemon =>
Some(String::from("Dracofeu"))
- ne pas évoluer du tout =>
None
pub struct Pokemon {
id: u16,
nom: String,
niveau: u16,
evolue_en: EvolueEn,
pokemon_type: Vec<TypeDePokemon>,
}
let bulbizarre = Pokemon {
id: 1,
nom: String::from("Bulbizarre"),
niveau: 1,
evolue_en: Some(String::from("Herbizarre")),
pokemon_type: vec![
TypeDePokemon::Herbe,
TypeDePokemon::Poison
],
};
impl Pokemon {
fn next_level(&mut self) {
println!("{} passe au niveau suivant !", self.nom);
self.niveau += 1;
}
}
Ça ressemble à de l'orienté objet, mais : pas d'héritage en rust !
En | le modèle est | On écrit d'abord… | et ensuite… |
---|---|---|---|
Orienté Objet, | top-down. | les classes mères, | les classes filles. |
Rust, | bottom-up. | le format de la donnée, | les structs. |
Par contre, on a plein d'interfaces en Rust (on appelle ça des traits).
Try/catch, throw… en Rust on a mieux que ça.
enum Result {
Ok(valeur),
Err(erreur),
}
Inclus dans l'offre :
- du pattern matching,
- des erreurs customs,
- du sucre syntaxique,
- des libs qui vous facilitent la vie
3 règles absolues :
- Une fonction qui prend en argument une variable
T
en a l'ownership — plus personne d'autre ne peut y toucher. - Une référence immutable
&T
peut être utilisée par plein de fonctions à la fois - Une référence mutable
&mut T
ne peut être utilisée que par une seule fonction à la fois
Big up à Benjamin Coenen qui a fait une super conf à Devoxx 2021 à ce sujet.
À force de cogner sur le clavier ça va passer.
ripgrep
: remplacegrep
(plus convivial)bat
: remplacecat
(coloration)sd
: remplacesed
fd
: remplacefind
dust
: remplacedu
(c'est beaucoup plus joli)
En Rust ça va plus vite.
Deno, runtime JavaScript et Typescript.
Sōzu, reverse proxy fait sur mesure pour Clever Cloud. Écrit par Geoffroy Couprie, aka Geal.
Le Rust book a été largement traduit en français!
Udemy, Exercism, etc.
Les questions de noobs sont bienvenues sur le forum de la communauté (en anglais)
Stack Overflow pour les puristes.
Écrivez-moi ! [email protected]
Et maintenant lees questions !