Rust 1.32には,デバッグ目的でプログラム実行をトレースする時の開発者エクスペリエンスを向上するための,新たな言語機能が多数含まれている。さらにメモリアロケーションには,デフォルトでシステムアロケータが使用されるようになった。今回のリリースではモジュールシステムの開発も完成し,使いやすくなっている。
新設されたdbg!
マクロは,デバッグ情報のプリントアウトを大きく合理化してくれる。変数x
の値をプリントしたい場合は単にdbg!(x);
とすればよい。println!("{:#?}", x);
という煩雑な式はもはや不要だ。さらにボーナスとしてdbg!
では,ファイルや行番号,ダンプした変数名が自動的に出力される。dbg!
の持つもうひとつの素晴らしい機能は,プリントアウトした値を返す関数であることだ。これによって次の例のように,式の中で使用することが可能になる。
fn factorial(n: u32) -> u32 {
if dbg!(n <= 1) {
dbg!(1)
} else {
dbg!(n * factorial(n - 1))
}
}
上のコードは次のような冗長なアウトプットを生成するので,再起呼び出しの各ステップを簡単に確認することができる。
[src/main.rs:3] n <= 1 = false
[src/main.rs:3] n <= 1 = false
[src/main.rs:3] n <= 1 = false
[src/main.rs:3] n <= 1 = true
[src/main.rs:4] 1 = 1
[src/main.rs:5] n * factorial(n - 1) = 2
[src/main.rs:5] n * factorial(n - 1) = 6
[src/main.rs:5] n * factorial(n - 1) = 24
[src/main.rs:11] factorial(4) = 24
モジュールパス解決の改善による構文の簡素化など,モジュールの利用をより簡単にするためにRust 1.31で導入されたモジュールの改良については,InfoQで以前にお伝えしている。Rust 1.32では一歩進んで,パスの統一化が図られている。これはuse
の後にcreate
,self
,あるいはsuper
を続けなければならないという要件を緩和することで,非インポートパスでのuse
を可能にするものだ。次の例はその使用法を示すものだ。
enum Color { Red, Green, Blue }
use Color::*;
前述のように,Rust 1.32ではマクロシステムも完全されており,literal
パターンマッチャが導入され,?
の使用が可能になった。例えば次の2つのマクロは,提供されたトークンリストがひとつのリレラル,および指定されたパターンの0回以上の繰り返しにマッチした場合に選択され展開される,単一のルールをそれぞれ定義したものだ。
macro_rules! m1 {
($lt:literal) => {};
}
macro_rules! m2 {
($(a)?) => {}
}
最後に,Rust 1.32ではついに,メモリアロケータがデフォルトでシステムアロケータを直接使用するように設定され,これまでのデフォルトアロケータであるjemalloc
はオプトインになった。Rust 1.28までは,Rustが独自のErlang風ランタイムを持っていた時代までその起源を遡る,jemalloc
のみが使用可能だった。当時のランタイムは非常に大きかったため,Rustチームは,CやC++などの言語で見られるようなタイプの最小限ランタイムへと,段階的な削減を続けてきた。旧ランタイムで最後に残ったのがjemalloc
で,すべてのRustバイナリにおいて約300KBを占めていたのだ。そのため,まずRust 1.28ではオプトアウトとし,今回のRust 1.32で,パフォーマンスを優先するすべてのケースにおいてオプトインとする決定が行われていた。
Rustの最新機能の興味があるならば,公式リリースノートですべての詳細を確認してほしい。