// Un enum prend plusieurs types prédéfinis
// chaque instance de cet enum devra choisir dans une de ces valeurs
enum IpAddrKind {
V4,
V6
}
//On peut aussi attacher des données
enum IpAddr {
V4(String),
V6(String)
}
//Voire les utiliser dans des structs
struct Address {
kind: IpAddrKind,
address: String
}
//Un enum peut contenir tout type de data
//et avoir des variantes sur le même modèle qu'un struct,
//l'avantage étant que c'est dans un seul objet
enum TresVarie {
RienDuTout,
DesChampsNommes {x: i32, y: i32},
UnString(String),
UnTuple(i32, i32)
}
//Et un enum peut aussi avoir des méthodes
impl Address {
fn print_add(&self) {
println!("{}", self.address);
}
}
fn main() {
//L'instanciation se fait sur le principe de namespace...
let home_add = IpAddr::V4(String::from("1.2.3.4"));
let whatever = IpAddr::V6;
let dns_add = Address {
kind: IpAddrKind::V4,
address: String::from("1.1.1.1")
};
dns_add.print_add()
}
//D'ailleurs, la lib standard implémente une définition pour les adresses IP
//sur ce modèle