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にならずコンパイルが通らなかった。ちょっと面倒くさい。