Rust 0.4

以前もRustを取り上げた。(プログラミング言語 Rust - M59の記録)
先月(2012年10月15日)バージョン0.4がリリースされていたので、同じプログラムをもう一度書いてみる。

// for Rust 0.4

// Rust 0.1のuseはextern modに変更された
// extern modはクレイトをリンクする
extern mod std;

// Rust 0.1のimportはuseに変更された
// useは識別子のエイリアスを作る
use sort = std::sort::quick_sort;

// ifaceはtraitに変更された
trait Str {
    fn str() -> ~str;
}

impl int: Str {
    fn str() -> ~str {
        int::str(self)
    }
}

fn main() {
    // 並列処理
    // チャネルとポート
    let (chan, port) = pipes::stream();
    // 共有チャネル
    let chan = pipes::SharedChan(move chan);
    // for文が追加された
    for int::range(0, 100) |i| {
        // 共有チャネルの複製
        let chan = chan.clone();
        // do文が追加された
        do task::spawn {
            let i = i + 1;
            // altはmatchに変更された
            // match式でパターンマッチング
            let b = match (i % 3, i % 5) {
                (0, 0) => ~"FizzBuzz",
                (0, _) => ~"Fizz",
                (_, 0) => ~"Buzz",
                _      => i.str()
            };
            chan.send((i, b));
        }
    }

    // mutableなベクター
    let mut res = ~[];
    // timesはiter::Timesトレイトのメソッド
    for 100.times {
        // メソッドの形で書ける
        res.push(port.recv());
    }

    // ~strがimplicitly copyable typeでないのでコンパイル時に警告が出る。
    sort(|t, u| {t.first() <= u.first()}, res);
    for res.each |t| {
        io::println(t.second());
    }
}

既にGitHubの開発リポジトリのバージョンでは動作しない。