あずんひの日

あずんひの色々を書き留めるブログ

Rust 1.49を早めに深掘り

HAPPY NEW YEAR! あずんひ(@aznhe21)です。 いつもは会社のテックブログで投稿してる深掘りシリーズですが、 Rust 1.49は大晦日~元日のリリースということで会社のブログに投げるのは難しかったためブログからお送りします。

f:id:aznhe21:20210101003450p:plain

安定化された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]);

変更点リスト

言語

#[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);

コンパイラ

※ RustのTierによるプラットフォームサポートの詳細はプラットフォームサポートのページを参照 ※訳注:英語ページ

ライブラリ

安定化されたAPI

また、以前から安定化されていたAPIのうち以下のAPIが定数化された。

Cargo

互換性メモ

内部の変更

これらの変更は直接ユーザーの利益をもたらすわけではないが、コンパイラ及び関連ツール内部での有意義なパフォーマンス改善を意味する。

関連リンク

さいごに

次のリリースのRust 1.50は2/11(金)にリリースされる予定です。1.50では、久々に多くの機能追加が予定されています。

  1. 皆さんお待ちかねの定数ジェネリクス
  2. スライス全体を同じ値で埋める
  3. 数値の範囲制限(clamp
  4. 真偽値でtrueだった場合にクロージャを実行するメソッド(地味に便利)

ライセンス表記

  • 冒頭の画像中にはRust公式サイトで配布されているロゴを使用しており、 このロゴはMozillaによってCC-BYの下で配布されています
  • 冒頭の画像はいらすとやさんの画像を使っています。いつもありがとうございます