本日9/19(金)にリリースされたRust 1.90の変更点を詳しく紹介します。 もしこの記事が参考になれば記事末尾から活動を支援頂けると嬉しいです。
この記事は原文の理解や和訳のために一部生成AIを使用していますが、すべて筆者の考えに基づく文章で構成しており、 漫然と生成AIを使用しているものではありません。
ピックアップ
個人的に注目する変更点を「ピックアップ」としてまとめました。 全ての変更点を網羅したリストは変更点リストをご覧ください。
x64のLinuxでリンクが高速になった
x86_64-unknown-linux-gnu環境では既定(BFD)のリンカーの代わりにLLVMのlldが使われるようになり、リンクが高速になりました。
Rustのコンパイルはリンクが長いので少しでも早くなるのは嬉しいですね。
この切り替えにより問題が発生した場合は(RUSTFLAGSなどを通して)コンパイラに-C linker-features=-lldを指定することで、
これまで同様既定のリンカーが使われるようになります。
ちなみに、これまで約1年の間Nightlyではテストとしてlldが使われていました。ここで大きな問題がなかったことで今回本採用に至ったようです。 [moldを使う]ことでさらに早くなる可能性もありますが、まだ提案段階のようです。
安定化されたAPIのドキュメント
安定化されたAPIのドキュメントを独自に訳して紹介します。リストだけ見たい方は安定化されたAPIをご覧ください。
u{n}::checked_sub_signed
impl usize { #[stable(feature = "mixed_integer_ops_unsigned_sub", since = "1.90.0")] #[rustc_const_stable(feature = "mixed_integer_ops_unsigned_sub", since = "1.90.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] pub const fn checked_sub_signed(self, rhs: isize) -> Option<Self> { /* 実装は省略 */ } }
符号付き整数と検査付きの引き算を行う。
self - rhsを計算し、オーバーフローが起きた場合はNoneを返す。
サンプル
assert_eq!(1usize.checked_sub_signed(2), None); assert_eq!(1usize.checked_sub_signed(-2), Some(3)); assert_eq!((usize::MAX - 2).checked_sub_signed(-4), None);
u{n}::overflowing_sub_signed
impl usize { #[stable(feature = "mixed_integer_ops_unsigned_sub", since = "1.90.0")] #[rustc_const_stable(feature = "mixed_integer_ops_unsigned_sub", since = "1.90.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] pub const fn overflowing_sub_signed(self, rhs: $SignedT) -> (Self, bool) { /* 実装は省略 */ } }
符号付きのrhsを使い、self - rhsを計算する。
算術にオーバーフローが発生したかどうかを示す真偽値と共に減算結果をタプルで返す。 オーバーフローが起きた場合は回り込んだ値が返される。
サンプル
assert_eq!(1usize.overflowing_sub_signed(2), (usize::MAX, true)); assert_eq!(1usize.overflowing_sub_signed(-2), (3, false)); assert_eq!((usize::MAX - 2).overflowing_sub_signed(-4), (1, true));
u{n}::saturating_sub_signed
impl usize { #[stable(feature = "mixed_integer_ops_unsigned_sub", since = "1.90.0")] #[rustc_const_stable(feature = "mixed_integer_ops_unsigned_sub", since = "1.90.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] pub const fn saturating_sub_signed(self, rhs: $SignedT) -> Self { /* 実装は省略 */ } }
符号付き整数と飽和する引き算を行う。
self - rhsを計算し、数値の境界ではオーバーフローではなく飽和を起こす。
サンプル
assert_eq!(1usize.saturating_sub_signed(2), 0); assert_eq!(1usize.saturating_sub_signed(-2), 3); assert_eq!((usize::MAX - 2).saturating_sub_signed(-4), usize::MAX);
u{n}::wrapping_sub_signed
impl usize { #[stable(feature = "mixed_integer_ops_unsigned_sub", since = "1.90.0")] #[rustc_const_stable(feature = "mixed_integer_ops_unsigned_sub", since = "1.90.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] pub const fn wrapping_sub_signed(self, rhs: $SignedT) -> Self { /* 実装は省略 */ } }
符号付き整数と折り返す(合同、modular)引き算を行う。
self - rhsを計算し、型の境界で回り込み(wrap around)が起きる。
サンプル
assert_eq!(1usize.wrapping_sub_signed(2), usize::MAX); assert_eq!(1usize.wrapping_sub_signed(-2), 3); assert_eq!((usize::MAX - 2).wrapping_sub_signed(-4), 1);
変更点リスト
言語
unknown_or_malformed_diagnostic_attributes警告を細分化。 この警告はより細かく4つの警告に分割され、unknown_or_malformed_diagnostic_attributesはそれらをまとめたグループとなった。- 最終的な値が可変・外部メモリへの参照を含む定数を許可。ただしパターンとしては却下
- Rust以外のメモリ(アドレス0を含む)への揮発性アクセスを許可
コンパイラ
x86_64-unknown-linux-gnuで標準のリンカとしてlldを使うようになった。- ティア3の
muslターゲットは、今後デフォルトで動的リンクとなる。影響するターゲットは以下の通り。mips64-unknown-linux-muslabi64powerpc64-unknown-linux-muslpowerpc-unknown-linux-muslpowerpc-unknown-linux-muslsperiscv32gc-unknown-linux-musls390x-unknown-linux-muslthumbv7neon-unknown-linux-musleabihf
プラットフォーム対応
Rustのティア付けされたプラットフォーム対応の詳細はPlatform Supportのページ(※訳注:英語)を参照
ライブラリ
u*::{checked,overflowing,saturating,wrapping}_sub_signedを安定化CStrとCString、Cow<CStr>同士の比較を許可- サイズ未確定タプルの実装の一部を削除(構築できないため)
UnixStreamでMSG_NOSIGNALを設定proc_macro::Ident::newが$crateをサポートThread::into_rawが返すポインタが8バイト以上のアライメントであると保証
安定化されたAPI
u{n}::checked_sub_signedu{n}::overflowing_sub_signedu{n}::saturating_sub_signedu{n}::wrapping_sub_signedimpl Copy for IntErrorKindimpl Hash for IntErrorKindimpl PartialEq<&CStr> for CStrimpl PartialEq<CString> for CStrimpl PartialEq<Cow<CStr>> for CStrimpl PartialEq<&CStr> for CStringimpl PartialEq<CStr> for CStringimpl PartialEq<Cow<CStr>> for CStringimpl PartialEq<&CStr> for Cow<CStr>impl PartialEq<CStr> for Cow<CStr>impl PartialEq<CString> for Cow<CStr>
以下のAPIが定数文脈で使えるようになった。
<[T]>::reversef32::floorf32::ceilf32::truncf32::fractf32::roundf32::round_ties_evenf64::floorf64::ceilf64::truncf64::fractf64::roundf64::round_ties_even
Cargo
Rustdoc
- すべての
implブロックをまとめて折りたたむ方法を追加。 これまでは「Summary」ボタンや「-」キーでimplブロックは折りたためなかったが、Shiftキーを押しながら操作することで折りたためるようになった。 unsafe属性をunsafe()ラッパー付きで表示するようになった。
互換性メモ
x86_64-unknown-linux-gnuでは標準のリンカとしてlldを使うようになった。 詳細はhttps://blog.rust-lang.org/2025/09/01/rust-lld-on-1.90.0-stable/(※訳注:英語ページ)も参照。core::iter::FuseのDefault実装において、常に空になるのではなく、文書通りI::default()で構築されるようになった。UnixStreamでMSG_NOSIGNALを設定するようになった。 これによりプログラムの動作が変わる場合があるが、他のもの(標準出力やネットワークソケットなど)と同じ動作になる。 書き込み時のエラーで終了するようなプログラムはソケットのエラー処理を見直す必要がある。- Unix環境の
std::env::home_dirにおいて、HOME環境変数が空の場合にフォールバックを使うようになった。 - 非対応の
extern "{abi}"をすべての場所で一貫して却下するようになった。 これは主に、ABIに非対応のプラットフォーム(aarch64-unknown-linux-gnuなど)で関数ポインタにトレイトを実装する場合(extern "stdcall" fn()など)に影響する。これらのABI文字列を使った関数の宣言や定義はすでに却下されていたため、今回の変更は一貫性のためのものである。 - 静的変数の初期化時に、その定数自身への書き込みが発生した場合はエラーになるようになった。
- クレートのてっぺんに適用された
proc_macro_deriveマクロの引数が正しいかどうかを検査するようになった。
関連リンク
さいごに
次のリリースのRust 1.91は10/31(金)にリリースされる予定です。
Rust 1.91ではIterator::chainをiter::chainとして使えるようになるほか、
TypeIdを定数として取得できるようになる予定です。