Génération de code
Les macros peuvent être utilisées pour générer du code. On veut ici définir une arithmétique un peu spéciale appelée "zéro arithmétique" : si le résultat d'une opération ne peut pas être représenté sur le type voulu, cela ne provoque pas une erreur mais renvoie la valeur 0.
On définit un trait Zero_Arith
qui rajoute des opérations sur les types qui implémentent ce trait :
trait ZeroArith {
fn zero_add(self, other: Self) -> Self;
fn zero_sub(self, other: Self) -> Self;
fn zero_mul(self, other: Self) -> Self;
fn zero_div(self, other: Self) -> Self;
}
On souhaite implémenter ce type pour tous les types entiers (isize
, i8
, i16
, i32
, i64
, i128
, usize
, u8
, u16
, u32
, u64
et u128
) tout en minimisant les répétitions de code.
- Après avoir défini ce trait, implémentez une macro
impl_zero_arith!
qui prend un type en paramètre et implémente les fonctions demandées.
On s'attend ici à ce que vous utilisiez une deuxième macro appelé par la première pour pouvoir implémenter, sur chaque type, les différentes fonctions en minimisant les répétitions.
- Testez votre code. Notamment
200u8.zero_add(200u8)
doit retourner0u8
, alors que100u8.zero_add(50u8)
retournera150u8
.