Rust 1.8 がリリースされました

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

- オフィシャルブログの [リリースアナウンス](http://blog.rust-lang.org/2016/04/14/Rust-1.8.html)
- [リリースノート](https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-180-2016-04-14)（GitHubリリースページ）
- Rust の [ダウンロードページ](https://www.rust-lang.org/downloads.html)

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

もしこれから Rust を始めるのでしたら、オフィシャルマニュアルの [日本語翻訳版](https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/) を読むのがいいでしょう。現状は Rust 1.6 をベースにしていますが、全体の [約93%](https://github.com/rust-lang-ja/the-rust-programming-language-ja/wiki/%E7%BF%BB%E8%A8%B3%E9%80%B2%E8%A1%8C%E7%8A%B6%E6%B3%81%E7%AE%A1%E7%90%86%E8%A1%A8%EF%BC%88Rust-1.6%EF%BC%89) が翻訳済みとなっています。また、近々、1.8 版のマニュアルへと更新する予定です。

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


## 1.8 安定版の内容

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

最初に紹介する機能は、`+=` や `-=` のような様々な「代入演算子」が、トレイトでオーバーロードできるようになったことです。この変更は [RFC 953](https://github.com/rust-lang/rfcs/blob/master/text/0953-op-assign.md) で承認され、こんな風に使います：

```rust
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 }` と表示されます。また他の演算子トレイトのように、関連型によって、演算子の左右に異なる型を持つこともできます。

２つ目に紹介するのは、[RFC 218](https://github.com/rust-lang/rfcs/blob/master/text/0218-empty-struct-with-braces.md) で導入された小さな機能です。Rust 1.8 以前では、フィールドを持たない構造体には、`{ }` を付けられませんでした。

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

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

Windows 関連の最新ニュースは、32ビット MSVC ビルドが [unwinding を実装した](https://github.com/rust-lang/rust/pull/30448) ことです。これにより i686-pc-windows-msvc が第１級（Tier 1）プラットフォームに仲間入りしました。

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


### ライブラリの安定化

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

詳しくは、[詳細なリリースノート](https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-180-2016-04-14) を参照してください。


### Cargo の機能

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

- [`cargo init`](https://github.com/rust-lang/cargo/pull/2081) は、カレントディレクトリで Cargo プロジェクトを初期化したい時に使います。一方、従来の `cargo new` はサブディレクトリを新たに作ります。
- [`cargo metadata`](https://github.com/rust-lang/cargo/pull/2196) は、プロジェクトのメタデータを取得する新しいサブコマンドです。
- `.cargo/config` に [`-v` と `--color`](https://github.com/rust-lang/cargo/pull/2397) のためのキーが加わりました。
- Cargo でターゲット毎の依存関係を扱う機能が [改良されました](https://github.com/rust-lang/cargo/pull/2328)。

詳しくは、[詳細なリリースノート](https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-180-2016-04-14) を参照してください。