Rust 0.10でFizzBuzz
毎度おなじみFizzBuzzでRustの変更点を確認しよう。
fn main() { let (tx, rx) = channel::<(int, std::str::MaybeOwned<'static>)>(); for i in range(0, 100) { let tx = tx.clone(); spawn(proc() { let i = i + 1; let b = match (i % 3, i % 5) { (0, 0) => "FizzBuzz".into_maybe_owned(), (0, _) => "Fizz".into_maybe_owned(), (_, 0) => "Buzz".into_maybe_owned(), _ => i.to_str().into_maybe_owned() }; tx.send((i, b)); }); } let mut res = ~[]; for _ in range(0, 100) { res.push(rx.recv()); } res.sort_by(|t, u| t.ref0().cmp(u.ref0())); for t in res.iter() { println!("{}", t.ref1().as_slice()); } }
do文は廃止された。ちょっと見栄えが良くないってだけだし、まあ、うん。
標準APIに大きく手が加えられて、色々な名前が変わったので全体的に修正が必要。
Rust 0.9のstd::comm::SharedChan::newと0.10のchannelでは返り値の型の名前が変わっている上に、順番も逆になっている。Rust 0.10では送信側 tx: Sender, 受信側 rx: Receiverの順番です。
タプルの参照から、タプル中の値を参照するときはrefNを使う。
std::str::MaybeOwned<'static>は型パラメーターを明示的に指定しないとstd::str::MaybeOwned<>と推論されてしまい、型がSendable typeにならずコンパイルが通らなかった。ちょっと面倒くさい。