ブログ名

競技プログラミングやお歌のお話をする高菜です。

個人的に嬉しい、AtCoder の Rust 言語アップデートで変わるもの一覧(Rust 1.70 → Rust 1.86)

気が早いですが、纏めてしまいました。まだ AtCoder に入るバージョンが確定はしていないと思いますので、変わったらまた更新しようと思います。

特に嬉しいもの

まずはぶっちぎりで LazyCell です。他には pop_if, div_ceil, isqrt, is_none_or, get_disjoint_mut, repeat_n, is_sorted, Saturating, associated_type_bounds, return_position_impl_trait_in_trait, inline_const_pat, あたり嬉しいですね。

変更点

言語機能など

機能 version コメント
exclusive_range_pattern 1.80 match 式などで 0..=9 の代わりに 0..10 などが使えます。なくて地味に不便だったやつです。
inline_const_pat 1.79 [const { Vec::new() }; N] みたいに書けます。使い手にしかわからない苦悩でした。
return_position_impl_trait_in_trait 1.75 trait に属する関数の戻り値を impl Trait にできます。これで余計な型定義が減りますね…!?
associated_type_bounds 1.79 where I: Iterator<Item: Display> みたいに書けます。
Propagate temporary lifetime extension into if and match. 1.79 if a { &f() } else { &g() } みたいに書けます。
Match usize/isize exhaustively with half-open ranges 1.75 usize, isize のパターンマッチングで、42..=usize::MAX の代わりに 42.. をしても網羅性エラーが出ません。
The [lints] section - Cargo 1.75 Cargo.tomllints が追加されました。これで Makefile.toml で地獄の lint 設定管理をしなくてよくなりますね。
Adding a warning block - rustdoc 1.75 doc comments で <div class="warning"> が使えるようになりました。

Numeric types

API version コメント
unsigned::midpoint 1.85 $(x + y) / 2$ です。二分探索などで便利ですね。float 版、NonZeroU* 版もあります。
unsigned::div_ceil 1.73 $\lceil x / y \rceil$ です。今まで独自定義するとコンパイラに怒られてみなさまブチギレていたやつです。ちなみに signed 版は未だ unstable です。is_multiple_of は 1.87 なのでギリギリ間に合いませんでした。
unsigned::next_multiple_of 1.73 $y \cdot \lceil x / y \rceil$ です。checked_ 版もあります。
int::isqrt 1.84 $\sqrt{x}$ です。NonZero* 版もあります。checked_ 版もあります。
NonZero 1.79 NonZero* 系をジェネリックにしたやつです。嬉しいですね。
Saturating 1.74 saturating_ 系の演算をする型です。最適化問題などで、異常値を MAX にしたいときなど嬉しいですね。

Option, Result

API version コメント
Option::get_or_insert_default 1.82 Option::get_mut の、None のときに Some(Default) を挿入してくれる版です。地味にときどき欲しくなるやつでしたね。
Option::is_none_or 1.82 None のときに trueSome のときは述語を評価します。なんで is_some_and は 1.70 からあったのにこれはなかったのですか!
Option::take_if 1.80 条件を満たすときだけ take します。
Option::as_slice 1.75 長さ 0 or 1 の slice を返します。_mut 版もあります。
{Option,Result}::inspect 1.76 Iterator::inspect みたいなやつです。_err 版もあります。

Slice, Containers, Tuples

API version コメント
slice::get_disjoint_mut 1.86 配列から複数箇所の可変参照を取ります。range とかも使えます。配列だけでなく HashMap でもできます。
slice::is_sorted 1.82 ソート済みかどうか。当然 _by, _by_key もあります。Iterator 版もあります。地味に面倒だったやつです。
slice::first_chunk 1.77 最初の &[T; N] を取得します。last 版、_mut 版もあります。split_ 版もあります。
slice::chunk_by 1.77 述語を用いて Iterator<Item = &[T]> を取得します。_mut 版もあります。
array::each_ref 1.77 &[T; N] -> [&T; N] ができます。mut 版もあります。
slice<array>::as_flattened 1.80 _mut 版もあります。flatten します。使う場面は思いつきませんでした。
Vec::pop_if 1.86 条件を満たすときだけ pop します。スタックを管理する系のアルゴリズムで大活躍すると思います。
[T; N](T₁, T₂, …, Tₙ) の相互変換 1.71 かゆいところに手が届きそうですね。

Iterator

API version コメント
iter::repeat_n 1.82 同じ要素を n 回繰り返します。もう .take(n) しなくていのですね!
impl FromIterator<(EA₁, EA₂, …, EAₙ)> for (A₁, A₂, …, Aₙ) 1.79, 1.85 tuple の iterator を container の tuple に集めます。従来の unzip は turbofish で書きづらいことと、trait ではないので collect::<Result<_>> などと組み合わせることができなかったのが難点でしたが、解決しましたね。

API version コメント
ptr::from_ref 1.76 as *const の代わりです。 mut 版もあります。今後 as は refutability を反映した syntax に置き換わっていく流れでしょうかね。
ptr::addr_eq 1.76 アドレスが等しいか比較します。特に参照同士がポインタとして等しいかを比較する時に便利です。
Box::new_uninit 1.82 Rc, Arc 版もあります。_slice 版もあります。assume_init もあります。限界高速化に使えそうな気もしますが、如何せん私が詳しくなしです。
LazyCell 1.80 Lock 版もあります。従来は 3rd party に頼らないとやりづらかった遅延初期化のコードが書きやすくなります!
DebugMap::finish_non_exhaustive 1.83 Debug を実装する方向け。map, set, list, tuple 版があります。ellipsis で表現します。

参考