BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース トレース,モジュール,マクロなどが改良されたRust 1.32

トレース,モジュール,マクロなどが改良されたRust 1.32

原文(投稿日:2019/01/23)へのリンク

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の後にcreateself,あるいは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の最新機能の興味があるならば,公式リリースノートですべての詳細を確認してほしい。

この記事に星をつける

おすすめ度
スタイル

特集コンテンツ一覧

BT