バージョン 1.13の開発でRustコアチームが取り組んできたのは,‘?
’をオペレータの新規導入によるエラー処理のための言語構文の改善,コンパイル時間の最適化,型レベルマクロのサポート追加だ。
Rustの新しいオペレータである‘?
’は,ローカルポリシがエラーを呼び出しチェーンに伝搬する場合のエラー処理を容易にする。言い換えれば,エラーを返す関数がある場合,以下のスニペットのように呼び出すことで,エラー発生の可能性に対処することができる。
let result = foo();
let mut result = match result {
Ok(val) => val,
Err(e) => return Err(e),
}
// tryオペレータを使用することも可能
Alternatively, you can use the try operator
let mut result = try!(foo());
新しい‘?
’オペレータは,上記のようにtry
構文の省略形として,より簡潔な基準を可能にするものと解釈することもできる。
let mut result = foo()?;
新しい構文のメリットは,次のように関数呼び出しがチェーンした場合,より明白になる。
try!(try!(try!(foo()).bar()).baz())
// 次のように記述可能
foo()?.bar()?.baz()?
‘?
’オペレータはRustマクロとして定義されている。Rustコアチームによれば,これは今後,言語の基盤となる機能に影響を与えることなく,新たな構文を導入するための方法の一例となる。
Rust 1.13ではコンパイラの新たな最適化も実施されており,いくつかのケースにおいては,コンパイル時間を50%までスピードアップすることができる。このことは,1.13の開発サイクル上でRustベンチマークのコンパイル時間の進化を示した次のグラフによく表れている。
9月1日に見られる,2つのベンチマークのコンパイル時間の急激な低下は,ひとつはこれまで要求された都度それぞれ計算されていた,関連型のキャッシュの改善によるものだ。
コンパイル時間の改善のもうひとつは,関数のインライン化に関する処理の最適化によるもので,実際にインライン関数を呼び出すクレートに対してのみ適用されるようになった。この変更のメリットを最もよく表す例は,現時点ではリリースされていないwinapi-0.3クレートだ。この場合,rustcは利用する他のクレートのマシンコードをまったく出力せず,中間的なMIR表現のみを生成する。
コンパイラの最適化に関してはこちらにも資料がある。
その他,Rust 1.13で実現された注目すべき変更点としては,
-
次の例のように,型の位置でマクロが使用可能になった。
macro_rules! Tuple { { $A:ty,$B:ty } => { ($A, $B) } } let x: Tuple!(i32, i32) = (1, 2);
- 次の例に示すように,属性をステートメントに適用することができるようになった。
// Apply a lint attribute to a single statement #[allow(uppercase_variable)] let BAD_STYLE = List::new();
ARMプラットフォームをターゲットとする開発者は,Rust 1.13には重大なコード生成のバグがあることを認識する必要がある。1.14ベータ版の使用を検討すべきだ。
150人以上のコントリビュータによって,Rust 1.13にはさらに多くの変更が含まれている。詳細はリリースノートを参照して頂きたい。
この記事を評価
- 編集者評
- 編集長アクション