HAPPY NEW YEAR! あずんひ(@aznhe21)です。 いつもは会社のテックブログで投稿してる深掘りシリーズですが、 Rust 1.49は大晦日~元日のリリースということで会社のブログに投げるのは難しかったためブログからお送りします。
安定化されたAPIのドキュメント
安定化されたAPIのドキュメントを独自に訳して紹介します。リストだけ見たい方は安定化されたAPIをご覧ください。
slice::select_nth_unstable
impl<T> [T] { #[stable(feature = "slice_select_nth_unstable", since = "1.49.0")] #[inline] pub fn select_nth_unstable(&mut self, index: usize) -> (&mut [T], &mut T, &mut [T]) where T: Ord, }
index
に位置する要素が最終的なソート結果と同じ位置になるように、スライスを並べ替える。
この並び替えには、i < index
部分のいかなる値もj > index
部分の値以下となる追加の特性がある。
また、この並び替えは不安定(任意の同値要素が位置index
に行き着く可能性がある)であり、
直接書き換え(メモリ確保なし)であり、かつ最悪の場合O(n)である。
この関数は他のライブラリではkth element
としても知られる。
この関数は3つの値
「与えられたインデックスのものよりも小さい全要素」「与えられたインデックスの値」「与えられたインデックスのものよりも大きな全要素」を返す。
現在の実装
現在の実装ではsort_unstable
と同じクイックソートアルゴリズムの、
クイックセレクトの部分をもとにしたアルゴリズムが使われる。
パニック
index >= len()
のときにパニックする。つまり、スライスが空の時は常にパニックする。
サンプル
let mut v = [-5i32, 4, 1, -3, 2]; // 中央値を探す v.select_nth_unstable(2); // 結果は以下のうちのいずれかになることしか保証されていない(ソート方法によって異なる) assert!(v == [-3, -5, 1, 2, 4] || v == [-5, -3, 1, 2, 4] || v == [-3, -5, 1, 4, 2] || v == [-5, -3, 1, 4, 2]);
slice::select_nth_unstable_by
impl<T> [T] { #[stable(feature = "slice_select_nth_unstable", since = "1.49.0")] #[inline] pub fn select_nth_unstable_by<F>( &mut self, index: usize, mut compare: F, ) -> (&mut [T], &mut T, &mut [T]) where F: FnMut(&T, &T) -> Ordering, }
index
に位置する要素が最終的なソート結果と同じ位置になるように、比較関数を使ってスライスを並べ替える。
この比較関数を使った並び替えには、i < index
部分のいかなる値もj > index
部分の値以下となる追加の特性がある。
また、この並び替えは不安定(任意の同値要素が位置index
に行き着く可能性がある)であり、
直接書き換え(メモリ確保なし)であり、かつ最悪の場合O(n)である。
この関数は他のライブラリではkth element
としても知られる。
この関数は渡された比較関数を使い、3つの値
「与えられたインデックスのものよりも小さい全要素」「与えられたインデックスの値」「与えられたインデックスのものよりも大きな全要素」を返す。
現在の実装
現在の実装ではsort_unstable
と同じクイックソートアルゴリズムの、
クイックセレクトの部分をもとにしたアルゴリズムが使われる。
パニック
index >= len()
のときにパニックする。つまり、スライスが空の時は常にパニックする。
サンプル
let mut v = [-5i32, 4, 1, -3, 2]; // 降順に並べ替えた場合の中央値を探す v.select_nth_unstable_by(2, |a, b| b.cmp(a)); // 結果は以下のうちのいずれかになることしか保証されていない(ソート方法によって異なる) assert!(v == [2, 4, 1, -5, -3] || v == [2, 4, 1, -3, -5] || v == [4, 2, 1, -5, -3] || v == [4, 2, 1, -3, -5]);
slice::select_nth_unstable_by_key
impl<T> [T] { #[stable(feature = "slice_select_nth_unstable", since = "1.49.0")] #[inline] pub fn select_nth_unstable_by_key<K, F>( &mut self, index: usize, mut f: F, ) -> (&mut [T], &mut T, &mut [T]) where F: FnMut(&T) -> K, K: Ord, }
index
に位置する要素が最終的なソート結果と同じ位置になるように、キー取出関数を使ってスライスを並べ替える。
このキー取出関数を使った並び替えには、i < index
部分のいかなる値もj > index
部分の値以下となる追加の特性がある。
また、この並び替えは不安定(任意の同値要素が位置index
に行き着く可能性がある)であり、
直接書き換え(メモリ確保なし)であり、かつ最悪の場合O(n)である。
この関数は他のライブラリではkth element
としても知られる。
この関数は渡されたキー取出関数を使い、3つの値
「与えられたインデックスのものよりも小さい全要素」「与えられたインデックスの値」「与えられたインデックスのものよりも大きな全要素」を返す。
現在の実装
現在の実装ではsort_unstable
と同じクイックソートアルゴリズムの、
クイックセレクトの部分をもとにしたアルゴリズムが使われる。
パニック
index >= len()
のときにパニックする。つまり、スライスが空の時は常にパニックする。
サンプル
let mut v = [-5i32, 4, 1, -3, 2]; // 絶対値で並べ替えた場合の中央値を探す v.select_nth_unstable_by_key(2, |a| a.abs()); // 結果は以下のうちのいずれかになることしか保証されていない(ソート方法によって異なる) assert!(v == [1, 2, -3, 4, -5] || v == [1, 2, -3, -5, 4] || v == [2, 1, -3, 4, -5] || v == [2, 1, -3, -5, 4]);
変更点リスト
言語
- 共用体が
Drop
を実装できるようになり、共用体のフィールドにManuallyDrop<T>
の形で共用体を持てるようになった - 無人の(uninhabitedな、バリアントの無い)列挙型を数値にキャストできるようになった
- パターンの中で、参照でもムーブでも値を束縛できるようになった。これにより、借用するかを要素ごとに選べるようになった
#[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!("{} {}", name, age);
コンパイラ
aarch64-unknown-linux-gnu
へのTier 1サポートを追加したaarch64-apple-darwin
へのTier 2サポートを追加したaarch64-pc-windows-msvc
へのTier 2サポートを追加したmipsel-unknown-none
へのTier 3サポートを追加した- LLVMの最小サポートバージョンをLLVM 9に引き上げた
- テストで生成されたスレッドからの出力もキャプチャされるようになった
- いくつかのターゲットでOSやベンダーの値を
none
やunknown
に変更した
※ RustのTierによるプラットフォームサポートの詳細はプラットフォームサポートのページを参照 ※訳注:英語ページ
ライブラリ
RangeInclusive
のcontains
メソッドを呼び出す際やRangeInclusive
でインデックスする際、レンジが使い果たされたかを確認するようになったToString::to_string
のデフォルト実装では内部バッファの切り詰めを行わないようになった- あらゆる長さの固定長配列において
ops::{Index, IndexMut}
が実装されるようになった
安定化されたAPI
また、以前から安定化されていたAPIのうち以下のAPIが定数化された。
Cargo
cargo-package
でクレートをビルドする際、独立して再現できるようになった。 ※訳注:これまではビルド結果にUID/GIDなどの情報が含まれていたが、それらの情報がビルド結果に含まれないようになったcargo-tree
が手続きマクロのクレートに目印を付けるようになった- ビルド時の環境変数
CARGO_PRIMARY_PACKAGE
を追加した。 この変数は、ユーザーが-p
で選択した、あるいはデフォルトでビルドされるクレートでのみ設定される - パッケージやターゲットを指定する際、グロブパターン(訳注:ワイルドカード)を使用できるようになった
互換性メモ
i686-unknown-freebsd
を、ホストTier2からターゲットTier2に格下げした。 訳注:これによりi686-unknown-freebsd
向けにツールチェーンが提供されなくなる。依然としてこのターゲット向けのビルドは可能- マクロ呼び出しがセミコロンで終わっていた場合、展開結果が何もなくても文として扱われるようになった
- 列挙型のバリアントに設定された組み込み属性について、コンパイラが正当性を確認するようになった。 以前は無効な属性や不使用の属性が無視されることがあった
- ドキュメントコメントでの先頭のスペースを、より一貫して除去するようになった(ただし挙動が変わる可能性あり)。 詳細はNew doc comment handling in rustdocを参照されたい ※訳注:英語ページ
- 関連型でトレイト境界が推論されなくなった
内部の変更
これらの変更は直接ユーザーの利益をもたらすわけではないが、コンパイラ及び関連ツール内部での有意義なパフォーマンス改善を意味する。
- コンパイラの内部クレートが
initial-exec
モデルのスレッド局所記憶(Thread Local Storage)でコンパイルされるようになった。 訳注:これにより、より効率的なコードが生成される可能性がある - 解決時に一度だけ可視性を計算するようになった
llvm-libunwind
のブートストラップの構成設定にsystem
を追加した- ブートストラップに、端末の色サポートを設定できる
--color
を追加した
関連リンク
さいごに
次のリリースのRust 1.50は2/11(金)にリリースされる予定です。1.50では、久々に多くの機能追加が予定されています。