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
関数型プログラミングでこういうの見かけますが、メソッド呼び出しを連結できるのは良いですね。
Documentation
https://doc.rust-lang.org/book/documentation.html
ソースコードに特殊なコメントを記載しておくと、ツールでドキュメント生成出来る。Java
のjavadoc
や、Python
等々サポートしている言語は多々ある有りますね。出自はクヌース先生の文芸的プログラミングですかね。
Conditional Compilation
https://doc.rust-lang.org/book/conditional-compilation.html
#[cfg]
にて色々設定できる。C言語でいう#if
、#ifdef
みたいなもののようです。
Testing
https://doc.rust-lang.org/book/testing.html
テストの実施環境について。言語に標準でテストの仕組みが含んでいたり、ドキュメントに記載されている。これだけでも今どきの言語だという感じがします。
テストの実施方法はドキュメントを読んだ限りではシンプル。assert_eq!
以外にもテスト用のマクロがあると思うので、実用となると色々と大変になるのでしょうが。
The Stack and the Heap
https://doc.rust-lang.org/book/the-stack-and-the-heap.html
スタックとヒープについて。 変数宣言でスタックが積み上がっていくなど、目新しいところはなさそう。
Unsafe
[https://doc.rust-lang.org/book/unsafe.html
危ない操作をどうしても行いたい時はunsafe
を使う。unsafe
を使わざるを得ない事は少ないようだ。
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; } }