Iterators

https://doc.rust-lang.org/book/iterators.html

fn main() {
    let num = (1..)
        .filter(|&x| x % 2 == 0)
        .filter(|&x| x % 3 == 0)
        .take(5)
        .collect::<Vec<i32>>();

    for n in num.iter() {
       println!("{}", n);
    }
}
$ cargo run
    Finished debug [unoptimized + debuginfo] target(s) in 1.21 secs
     Running `target/debug/5_5_iterators`
6
12
18
24
30

関数型プログラミングでこういうの見かけますが、メソッド呼び出しを連結できるのは良いですね。

Testing

https://doc.rust-lang.org/book/testing.html

テストの実施環境について。言語に標準でテストの仕組みが含んでいたり、ドキュメントに記載されている。これだけでも今どきの言語だという感じがします。

テストの実施方法はドキュメントを読んだ限りではシンプル。assert_eq!以外にもテスト用のマクロがあると思うので、実用となると色々と大変になるのでしょうが。

Raw Pointers

https://doc.rust-lang.org/book/raw-pointers.html

単に*で宣言したポインタは安全ではない(何も指し示していないかもしれない)ので、unsafe内で展開して使用する。

fn main() {
    let x = 5;
    let raw = &x as *const i32;
    // println!("raw points at {}", *raw);
    let points_at = unsafe { *raw };
    println!("raw points at {}", points_at);

    let mut y = 10;
    let raw_mut = &mut y as *mut i32;
    // println!("raw points at {}", *raw_mut);
    let points_at = unsafe { *raw_mut };
    println!("raw points at {}", points_at);

    // Explicit cast:
    let i: u32 = 1;
    let p_imm: *const u32 = &i as *const u32;

    // Implicit coercion:
    let mut m: u32 = 2;
    let p_mut: *mut u32 = &mut m;

    unsafe {
        let ref_imm: &u32 = &*p_imm;
        let ref_mut: &mut u32 = &mut *p_mut;
    }
}