Rustチームは昨年の大みそかにRust 1.49をリリースした。Rustの新しいバージョンには、64ビットARMサポートとマイナーな言語拡張機能が含まれる。
Rustのunion
は、Drop
トレイトを実装できるようになった(オブジェクトがスコープ外になると、drop
メソッドが自動的に呼び出される)。開発者が手動でdropしたいunionフィールドには、ManuallyDrop<T>
タイプのアノテーションが付けられる。Rustのドキュメントには次にように記述されている。
unionの宣言は、
struct
の代わりにunion
を使用することを除いて、structの宣言と同じ構文を使用します。
#[repr(C)]
union MyUnion {
f1: u32,
f2: f32,
}
unionがdropされるとき、どのフィールドをdropする必要があるかはわかりません。このため、すべてのunionフィールドは、
Copy
タイプまたはManuallyDrop<_>
である必要があります。これにより、unionがスコープ外になったときに何もdropする必要がなくなります。
ある運用担当者は、新しい言語機能の1つの利点について詳しく説明した。
これは、低レベルの非同期コードで一般的な「アトミックステートマシン」パターンを正しく実装するのに役立ちます。このパターンでは、アトミックに更新されるタグ(ロックされた状態など)を持つタグ付きunionを得ることができます。
値を持たない列挙型(たとえば、enum Foo { }
)を整数にキャストできるようになった。この変更により、マクロコードに現れたエッジケースに対応できる。
Rust開発者は、パターンの参照や移動によってバインドできるようになった。主な使用例は、個々の型のコンポーネントを借用することである。
fn main() {
#[derive(Debug)]
struct Person {
name: String,
age: u8,
}
let person = Person {
name: String::from("Alice"),
age: 20,
};
// `name` is moved out of person, but `age` is referenced
let Person { name, ref age } = person;
println!("The person's age is {}", age);
println!("The person's name is {}", name);
// Error! borrow of partially moved value: `person` partial move occurs
//println!("The person struct is {:?}", person);
// `person` cannot be used but `person.age` can be used as it is not moved
println!("The person's age from person struct is {}", person.age);
}
新しいバージョンのRustにより、aarch64-unknown-linux-gnu
ターゲットがTier1サポートに昇格した。これは、Linuxで64ビットARMシステムを使用している開発者は、コンパイラにマージされたすべての変更に対して完全なテストスイートが実行されていることを意味する。ビルド済みのバイナリも利用できる。チームは、64ビットARMサポートが、組み込みからデスクトップおよびサーバに及ぶワークロードに役立つことを期待している。リリースノートで次にように説明されている。
これはプロジェクトにとって重要なマイルストーンです。x86以外のターゲットがTier1サポートに到達するのは初めてであるためです。これをきっかけに、将来、より多くのターゲットが最上位のTierに到達するための道が開かれることを願っています。
新しいRustバージョンでは、Apple M1システム(aarch64-apple-darwin
ターゲット)およびWindowsを実行する64ビットARMデバイス(aarch64-pc-windows-msvc
ターゲット)のTier2サポートも追加されている。
以前のバージョンのRustをrustup
でインストールしている開発者は、次のコマンドを使用してRust 1.49.0にアップグレードできる。
rustup update stable
詳細なリリースノートはオンラインで閲覧できる。