Rust 1.8 が本日(日本時間2016年4月15日)リリースされました。Rust は、安全性、スピード、並列プログラミングにフォーカスした、システムプログラミング向けの言語です。

    • オフィシャルブログの リリースアナウンス

リリースノート(GitHubリリースページ)
Rust の ダウンロードページ

また同時に、次のバージョン 1.9 がベータ版になりました。1.9 のリリース予定日は、6週間後の2016年5月27日(日本時間)です。

もしこれから Rust を始めるのでしたら、オフィシャルマニュアルの 日本語翻訳版 を読むのがいいでしょう。現状は Rust 1.6 をベースにしていますが、全体の 約93% が翻訳済みとなっています。また、近々、1.8 版のマニュアルへと更新する予定です。

(これ以降はリリースアナウンスの抄訳です)

1.8 安定版の内容

Rust 1.8 には言語上の新機能が2つあり、さらに、Windows ユーザーの方にはグッドニュースがあります! また、私たちの make ベースのビルドシステムを、Cargo をベースにしたものに置き換える作業が進行中です。

最初に紹介する機能は、+= や -= のような様々な「代入演算子」が、トレイトでオーバーロードできるようになったことです。この変更は RFC 953 で承認され、こんな風に使います:

use std::ops::AddAssign;

#[derive(Debug)]
struct Count {
    value: i32,
}

impl AddAssign for Count {
    fn add_assign(&mut self, other: Count) {
        self.value += other.value;
    }
}

fn main() {
    let mut c1 = Count { value: 1 };
    let c2 = Count { value: 5 };

    c1 += c2;

    println!("{:?}", c1);
}

これを実行すると Count { value: 6 } と表示されます。また他の演算子トレイトのように、関連型によって、演算子の左右に異なる型を持つこともできます。

2つ目に紹介するのは、RFC 218 で導入された小さな機能です。Rust 1.8 以前では、フィールドを持たない構造体には、{ } を付けられませんでした。

struct Foo; // OK
struct Bar { } // エラー

今後は2つめの書式もエラーになりません。このような制限を設けていたのは、他の中身を持たない宣言との一貫性を保ったり、構文解析の曖昧さを回避するためだったりしました。しかし、Rust 1.0 以降では、(訳注:構文が修正され)そのような曖昧さはもうありません。マクロの作者にとっては、(訳注:match 式などで)以前からの文法を扱うには、スペシャルケースが必要となり、面倒なものでした。また、活発に開発しているユーザーは、構造体を、中身なしバージョンと中身ありバージョンの間で切り替えることがあり、その度に、(訳注:中括弧あり・なしに)編集したり、diff が見づらくなったりすることは、理想的とはいえませんでした。

Windows 関連の最新ニュースは、32ビット MSVC ビルドが unwinding を実装した ことです。これにより i686-pc-windows-msvc が第1級(Tier 1)プラットフォームに仲間入りしました。

最後に、私たちは Rust をビルドするために、長い間 make を使ってきました。しかし、いまや私たちには、Rustプログラムをビルドするための、「Cargo」という素晴らしいツールがあります。Rust 1.8 では、Cargo をベースに、Rust 自身で書かれた新しいビルドシステムの 初期的なサポートが導入されました。まだデフォルトではなく、多くの作業が残っています。作業が完了したらリリースノートでお伝えしますが、今のところ、詳細については GitHub issue を参照してください。

ライブラリの安定化

Rust 1.8 では、約20個のライブラリー関数とメソッドが安定化されました。これらの変更は、大きく次の3つのグループに分けられます:UTF-16 関連の文字列メソッド、時間に関する様々な API、言語セクションで紹介した演算子のオーバーロードに必要となる様々なトレイトです。

詳しくは、詳細なリリースノート を参照してください。

Cargo の機能

Cargo についてもいくつかのアップデートがあります:

cargo init は、カレントディレクトリで Cargo プロジェクトを初期化したい時に使います。一方、従来の cargo new はサブディレクトリを新たに作ります。

cargo metadata は、プロジェクトのメタデータを取得する新しいサブコマンドです。

.cargo/config に -v と –color のためのキーが加わりました。
Cargo でターゲット毎の依存関係を扱う機能が 改良されました。

詳しくは、詳細なリリースノート を参照してください。