注意: 最新版のドキュメントをご覧ください。この第2版ドキュメントは古くなっており、最新情報が反映されていません。リンク先のドキュメントが現在の Rust の最新のドキュメントです。

付録F: 最新の機能

この付録は、本の主な部分が完成してから安定版Rustに追加された機能をドキュメント化しています。

フィールド初期化省略

fieldnamefieldname: fieldnameの省略として記述することでデータ構造(構造体、enum、ユニオン)を名前付きのフィールドで、 初期化することができます。これにより、重複を減らし、コンパクトな記法の初期化が許容されます。

#[derive(Debug)]
struct Person {
    name: String,
    age: u8,
}

fn main() {
    // ピーター
    let name = String::from("Peter");
    let age = 27;

    // フル記法:
    // Using full syntax:
    let peter = Person { name: name, age: age };

    // ポーティア
    let name = String::from("Portia");
    let age = 27;

    // フィールド初期化省略:
    // Using field init shorthand:
    let portia = Person { name, age };

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

ループから戻る

loopの1つの使用法は、スレッドが仕事を終えたか確認するなど、失敗する可能性のあることを知っている処理を再試行することです。 ですが、その処理の結果を残りのコードに渡す必要がある可能性があります。それをループを停止させるために使用するbreak式に追加したら、 breakしたループから返ってきます。

fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };

    assert_eq!(result, 20);
}

use宣言のネストされたグループ

多くの異なるサブモジュールがある複雑なモジュール木があり、それぞれからいくつかの要素をインポートする必要があるなら、 同じ宣言の全インポートをグループ化し、コードを綺麗に保ち、ベースモジュールの名前を繰り返すのを回避するのが有用になる可能性があります。

use宣言は、単純なインポートとグロブを使用したもの両方に対して、そのような場合に手助けになるネストをサポートしています。 例を挙げれば、このコード片は、barFoobazの全要素、Barをインポートします。

# #![allow(unused_imports, dead_code)]
#
# mod foo {
#     pub mod bar {
#         pub type Foo = ();
#     }
#     pub mod baz {
#         pub mod quux {
#             pub type Bar = ();
#         }
#     }
# }
#
use foo::{
    bar::{self, Foo},
    baz::{*, quux::Bar},
};
#
# fn main() {}

境界を含む範囲

以前は、範囲を式として使用する際、..でなければならず、これは上限を含まない一方、パターンは...を使用しなければならず、 これは、上限を含みます。現在では、..=が式と範囲の文脈両方で上限を含む範囲の記法として受け付けられます。

fn main() {
    for i in 0 ..= 10 {
        match i {
            0 ..= 5 => println!("{}: low", i),
            6 ..= 10 => println!("{}: high", i),
            _ => println!("{}: out of range", i),
        }
    }
}

...記法はそれでも、matchでは受け付けられますが、式では受け付けられません。..=を使用すべきです。

128ビット整数

Rust1.26.0で128ビットの整数基本型が追加されました:

  • u128: 範囲[0, 2^128 - 1]の128ビットの非負整数
  • i128: 範囲[-(2^127), 2^127 - 1]の128ビットの符号付き整数

これらの基本型は、LLVMサポート経由で効率的に実装されています。ネイティブに128ビット整数をサポートしないプラットフォームですら利用可能で、 他の整数型のように使用できます。

これらの基本型は、特定の暗号化アルゴリズムなど、非常に大きな整数を効率的に使用する必要のあるアルゴリズムで、とても有用です。