Rust

Any donation is very welcome
Fork me on GitHub

III. Aller plus loin

7. Codes annexes

Cette section n'a pas réellement d'intérêt si ce n'est montrer quelques fonctionnalités ou comportements que j'ai trouvé intéressants.

Écrire des nombres différemment

Runlet a = 0_0;
let b = 0--0_0--0;
let c = 0-!0_0-!0;
let d = 0xdeadbeef;
let e = 0x_a_bad_1dea_u64;

On peut aussi se servir du _ pour faciliter la lecture des nombres :

Runlet a = 12_u32;
let b = 1_000_000;

Toujours plus de parenthèses !

Runfn tmp() -> Box<FnMut() -> Box<FnMut() -> Box<FnMut() -> Box<FnMut(i32) -> i32>>>> {
    Box::new(|| { Box::new(|| { Box::new(|| { Box::new(|a| { 2 * a }) }) }) })
}

fn main() {
    println!("{}", tmp()()()()(1));
}

Utiliser la méthode d'un trait

Vous savez qu'il est possible de définir une méthode dans un trait, mais qu'on est forcé d'implémenter ce trait pour pouvoir l'appeler. Hé bien voici une méthode pour contourner cette limitation :

Runtrait T {
}

impl T {
    fn yop() {
        println!("yop");
    }
}

fn main() {
    T::yop()
}

Toujours plus vers le fonctionnel avec le slice pattern !

J'ai trouvé cette fonctionnalité assez sympa (mais encore instable pour le moment) donc je la mets ici :

Run#![feature(slice_patterns)]

fn sum(values: &[i32]) -> i32 {
    match values {
        [head, tail..] => head + sum(tail),
        [] => 0,
    }
}

fn main() {
    println!("Sum: {}", sum(&[1, 2, 3, 4]));
}