Rust : packages
lib.rs <syntaxhighlight lang='rust'> //J'ai créé une librairie avec cargo new malib --lib //Je suis ici dans la crate (la crate, c'est ce fichier !) //Je pourrais avoir deux crate dans le même package (un main.rs et un lib.rs) // //ici j'ai plusieurs modules, certains sont imbriqués. Ils sont privés par défaut //Un parent ne peut pas utiliser ses enfants privés, mais l'inverse est vrai. // //Les règles sont les suivantes: //* Une fonction/module peut toujours appeller ses soeurs //* Pour appeller les enfants de ses soeurs, ceux-ci doivent être publics //* On peut appeller un module ou une fonction marquée publique, si on a accès à son parent // //Le module suivant est dans un fichier à part; //J'appelle son mod uniquement ici, je n'ai pas besoin de le remettre dans le deuxième fichier //qui s'appelle front_of_house.rs mod front_of_house; pub use crate::front_of_house::hosting;
//Je vais créer ma fonction publique, qui elle sera accessible de l'extérieur //eat_at_restaurant et front_of_house sont siblings, je peux donc appeller l'un //depuis l'autre pub fn get_seated() {
//Je peux appeller une fonction dans la même crate par un chemin absolu... //crate est un mot-clef crate::front_of_house::hosting::add_to_waitlist();
//...ou relatif front_of_house::hosting::add_to_waitlist();
}
fn deliver_order() {}
mod back_of_house {
fn fix_incorrect_order() { cook_order(); //Ici, le mot-clef super permet d'appeller quelque chose dans le parent //Un peu comme utiliser .. dans un système de fichiers super::deliver_order(); }
fn cook_order() {}
//On peut aussi rendre un struct ou un enum public //Pour un struct, ses éléments restent privés par défaut pub struct Breakfast { pub toast: String, //seasonal_fruit est privé seasonal_fruit: String, }
impl Breakfast { //Ici, j'ai une méthode publique pour construire mon objet //et le renvoyer pub fn summer(toast: &str) -> Breakfast { Breakfast { toast: String::from(toast), seasonal_fruit: String::from("peaches"), } } }
//Les éléments d'un enum public sont publics //par défaut pub enum Appetizer { Soup, Salad, }
}
pub fn eat_at_restaurant() {
// Order a breakfast in the summer with Rye toast let mut meal = back_of_house::Breakfast::summer("Rye"); // Change our mind about what bread we'd like meal.toast = String::from("Wheat"); println!("I'd like {} toast please", meal.toast);
// The next line won't compile if we uncomment it; we're not allowed // to see or modify the seasonal fruit that comes with the meal // meal.seasonal_fruit = String::from("blueberries"); // //Calling my public enum: //back_of_house is a sibling so I can access it //the enum itself is public so no issues let order1 = back_of_house::Appetizer::Soup;
}
//On peut utiliser le mot use pour raccourcir les appels //Un peu comme un lien symbolique //...mais cela ne marche que dans le scope où l'on utilise use //La façon habituelle d'appeller des modules et des fonctions est d'appeller //son parent... use crate::front_of_house::hosting;
//Ceci ne fonctionne pas ! //mod customer_notworking { // pub fn somethingsomething() { // hosting::add_to_waitlist(); // } //}
//Ceci fonctionne mod customer {
pub fn something() { use crate::front_of_house::hosting; hosting::add_to_waitlist; }
}
//...en revanche la façon idiomatique d'appeller des enums //et des structs est de les appeller directement //(Sauf si on en appelle 2 qui ont le même nom) use std::collections::HashMap; fn notmain() {
let mut map = HashMap::new(); map.insert(1, 2);
}
//On peut aussi faire des alias comme en Python... use std::io::Result as IoResult;
//On peut combiner pub et use pour importer du code
//et le rendre public
//Cela s'appelle du re-exporting
pub use crate::front_of_house::hosting;
pub fn whatever() {
hosting::add_to_waitlist();
}
//Si l'on a beaucoup d'imports, on peut factoriser
//Ceci
use std::cmp::Ordering;
use std::io;
//Peut s'écrire use std::{cmp::Ordering, io};
//On peut importer tous les éléments publics dans le scope
use std::collections::*;
</syntaxhighlight>
front_of_house.rs <syntaxhighlight lang='rust'> //Je rend le module public pour pouvoir l'appeller dans eat_at_restaurant() pub mod hosting {
pub fn add_to_waitlist() { //Ici, je peux appeller une fonction privée, //par exemple seat_at_table() } fn seat_at_table() {}
}
mod serving {
fn take_order() {}
fn serve_order() {}
fn take_payment() {}
}
</syntaxhighlight>