From 7306b27f3ebed2337e604e390c9d34fa2130124a Mon Sep 17 00:00:00 2001 From: dyskinmel Date: Wed, 5 Feb 2025 11:04:31 -0600 Subject: [PATCH 01/10] =?UTF-8?q?summary=E3=82=92=E3=82=A2=E3=83=83?= =?UTF-8?q?=E3=83=97=E3=83=87=E3=83=BC=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SUMMARY.md | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 5c12430..c1ce94d 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -70,3 +70,73 @@ - [構文の予約](rust-2021/reserving-syntax.md) - [警告からエラーへの格上げ](rust-2021/warnings-promoted-to-error.md) - [マクロ規則における OR パターン](rust-2021/or-patterns-macro-rules.md) + +## Rust 2024 + + + +- [Rust 2024](rust-2024/index.md) + - [Language](rust-2024/language.md) + - [RPIT lifetime capture rules](rust-2024/rpit-lifetime-capture.md) + - [`if let` temporary scope](rust-2024/temporary-if-let-scope.md) + - [Tail expression temporary scope](rust-2024/temporary-tail-expr-scope.md) + - [Match ergonomics reservations](rust-2024/match-ergonomics.md) + - [Unsafe `extern` blocks](rust-2024/unsafe-extern.md) + - [Unsafe attributes](rust-2024/unsafe-attributes.md) + - [`unsafe_op_in_unsafe_fn` warning](rust-2024/unsafe-op-in-unsafe-fn.md) + - [Disallow references to `static mut`](rust-2024/static-mut-references.md) + - [Never type fallback change](rust-2024/never-type-fallback.md) + - [Macro fragment specifiers](rust-2024/macro-fragment-specifiers.md) + - [Missing macro fragment specifiers](rust-2024/missing-macro-fragment-specifiers.md) + - [`gen` keyword](rust-2024/gen-keyword.md) + - [Reserved syntax](rust-2024/reserved-syntax.md) + - [Standard library](rust-2024/standard-library.md) + - [Prelude への変更点](rust-2024/prelude.md) + - [Add `IntoIterator` for `Box<[T]>`](rust-2024/intoiterator-box-slice.md) + - [Newly unsafe functions](rust-2024/newly-unsafe-functions.md) + - [Cargo](rust-2024/cargo.md) + - [Cargo: Rust-version aware resolver](rust-2024/cargo-resolver.md) + - [Cargo: Table and key name consistency](rust-2024/cargo-table-key-names.md) + - [Cargo: Reject unused inherited default-features](rust-2024/cargo-inherited-default-features.md) + - [Rustdoc](rust-2024/rustdoc.md) + - [Rustdoc combined tests](rust-2024/rustdoc-doctests.md) + - [Rustdoc nested `include!` change](rust-2024/rustdoc-nested-includes.md) + - [Rustfmt](rust-2024/rustfmt.md) + - [Rustfmt: Style edition](rust-2024/rustfmt-style-edition.md) + - [Rustfmt: Formatting fixes](rust-2024/rustfmt-formatting-fixes.md) + - [Rustfmt: Combine all delimited exprs as last argument](rust-2024/rustfmt-overflow-delimited-expr.md) + - [Rustfmt: Raw identifier sorting](rust-2024/rustfmt-raw-identifier-sorting.md) + - [Rustfmt: Version sorting](rust-2024/rustfmt-version-sorting.md) \ No newline at end of file From a9fc27de87c0dddcd9720b6ef6c6beb1c3373911 Mon Sep 17 00:00:00 2001 From: dyskinmel Date: Wed, 5 Feb 2025 11:05:01 -0600 Subject: [PATCH 02/10] =?UTF-8?q?Changes=20to=20the=20prelude=E3=81=AB?= =?UTF-8?q?=E7=BF=BB=E8=A8=B3=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rust-2024/prelude.md | 139 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 src/rust-2024/prelude.md diff --git a/src/rust-2024/prelude.md b/src/rust-2024/prelude.md new file mode 100644 index 0000000..b42349c --- /dev/null +++ b/src/rust-2024/prelude.md @@ -0,0 +1,139 @@ + + +# Prelude への変更点 + + + +## 概要 + + + +- [`Future`] と [`IntoFuture`] トレイトが Prelude に含まれるようになりました。 +- その結果、一部のコードでトレイトメソッドの呼び出しがあいまいになり、コンパイルに失敗する可能性があります。 + +[`Future`]: ../../std/future/trait.Future.html +[`IntoFuture`]: ../../std/future/trait.IntoFuture.html + + + +## 詳細 + + + +[標準ライブラリのPrelude](../../std/prelude/index.html) は、すべてのモジュールで自動的にインポートされる項目をまとめたモジュールです。例えば、`Option`、`Vec`、`drop`、`Clone` など、よく使われる項目が含まれています。 + + + + +Rust コンパイラは、Prelude からインポートされる項目よりも、明示的にインポートされた項目を優先します。たとえば、`example` というクレートやモジュールに `pub struct Option;` が定義されている場合、`use example::*;` とすれば、`Option` は標準ライブラリのものではなく `example` のものが使われます。 + + + +ただし、_トレイト_ を Prelude に追加すると、既存のコードに微妙な影響が生じることがあります。たとえば、`MyPoller` というトレイトの `poll` メソッドを呼び出しているコードに、同時に標準ライブラリの `Future` トレイトもインポートされている場合、どちらの `poll` を呼ぶべきかがあいまいになり、コンパイルに失敗する可能性があります。 + + + +そのため、Rust 2024 では新しい Prelude が導入されます。基本的な内容は現行のものと変わりませんが、以下の項目が追加されています: + + +- 追加された項目: + - [`std::future::Future`][`Future`] + - [`std::future::IntoFuture`][`IntoFuture`] + + + +## 移行 + + + +### 競合するトレイトメソッド + + + +スコープ内にある二つのトレイトが同じメソッド名を持つ場合、どちらのトレイトメソッドを使うべきかがあいまいになってしまいます。例えば、次のコードをご覧ください。 + +```rust,edition2021 +trait MyPoller { + // This name is the same as the `poll` method on the `Future` trait from `std`. + fn poll(&self) { + println!("polling"); + } +} + +impl MyPoller for T {} + +fn main() { + // Pin<&mut async {}> implements both `std::future::Future` and `MyPoller`. + // If both traits are in scope (as would be the case in Rust 2024), + // then it becomes ambiguous which `poll` method to call + core::pin::pin!(async {}).poll(); +} +``` + + + +これをすべてのエディションで正しく動作させるためには、完全修飾構文を使う必要があります。 + +```rust,ignore +fn main() { + // Now it is clear which trait method we're referring to + <_ as MyPoller>::poll(&core::pin::pin!(async {})); +} +``` + + + +また、[`rust_2024_prelude_collisions`] リントは、あいまいなメソッド呼び出しを自動的に完全修飾構文に変更してくれます。このリントは `rust-2024-compatibility` リントグループの一部であり、`cargo fix --edition` を実行すると自動的に適用されます。Rust 2024 エディションに互換性のあるコードに移行するには、次のコマンドを実行してください。 + +```sh +cargo fix --edition +``` + + + +もしくは、完全修飾が必要な箇所を見つけるために、リントを手動で有効にすることもできます。 + +```rust +// Add this to the root of your crate to do a manual migration. +#![warn(rust_2024_prelude_collisions)] +``` + +[`rust_2024_prelude_collisions`]: ../../rustc/lints/listing/allowed-by-default.html#rust-2024-prelude-collisions From f5707e0aba68cae7002a363a5ff0b9ca5d7629b5 Mon Sep 17 00:00:00 2001 From: dyskinmel Date: Wed, 5 Feb 2025 13:25:52 -0600 Subject: [PATCH 03/10] =?UTF-8?q?=E7=BF=BB=E8=A8=B3=E3=82=922021=20prelude?= =?UTF-8?q?=E3=82=92=E5=8F=82=E8=80=83=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rust-2024/prelude.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/rust-2024/prelude.md b/src/rust-2024/prelude.md index b42349c..f8bfb9d 100644 --- a/src/rust-2024/prelude.md +++ b/src/rust-2024/prelude.md @@ -15,8 +15,8 @@ - This might make calls to trait methods ambiguous which could make some code fail to compile. --> -- [`Future`] と [`IntoFuture`] トレイトが Prelude に含まれるようになりました。 -- その結果、一部のコードでトレイトメソッドの呼び出しがあいまいになり、コンパイルに失敗する可能性があります。 +- [`Future`] と [`IntoFuture`] トレイトがプレリュードに追加されました。 +- その結果、一部のコードでトレイトメソッドの呼び出しが一意に決定できなくなり、コンパイルに失敗する可能性があります。 [`Future`]: ../../std/future/trait.Future.html [`IntoFuture`]: ../../std/future/trait.IntoFuture.html @@ -32,7 +32,7 @@ The [prelude of the standard library](../../std/prelude/index.html) is the modul It contains commonly used items such as `Option`, `Vec`, `drop`, and `Clone`. --> -[標準ライブラリのPrelude](../../std/prelude/index.html) は、すべてのモジュールで自動的にインポートされる項目をまとめたモジュールです。例えば、`Option`、`Vec`、`drop`、`Clone` など、よく使われる項目が含まれています。 +[標準ライブラリのプレリュード](../../std/prelude/index.html) は、すべてのモジュールで自動的にインポートされる項目をまとめたモジュールです。例えば、`Option`、`Vec`、`drop`、`Clone` など、よく使われる項目が含まれます。 -Rust コンパイラは、Prelude からインポートされる項目よりも、明示的にインポートされた項目を優先します。たとえば、`example` というクレートやモジュールに `pub struct Option;` が定義されている場合、`use example::*;` とすれば、`Option` は標準ライブラリのものではなく `example` のものが使われます。 +Rust コンパイラは、Prelude からインポートされる項目よりも、明示的にインポートされた項目を優先します。たとえば、`example` というクレートやモジュールに `pub struct Option;` が定義されている場合、`use example::*;` とした場合、`Option` は標準ライブラリのものではなく `example` のものが使われます。 -ただし、_トレイト_ を Prelude に追加すると、既存のコードに微妙な影響が生じることがあります。たとえば、`MyPoller` というトレイトの `poll` メソッドを呼び出しているコードに、同時に標準ライブラリの `Future` トレイトもインポートされている場合、どちらの `poll` を呼ぶべきかがあいまいになり、コンパイルに失敗する可能性があります。 +ただし、_トレイト_ をプレリュードに追加すると、既存のコードに微妙な影響が生じ壊れることがあります。たとえば、`MyPoller` というトレイトの `poll` メソッドを `x.poll()` と呼び出しているコードに、`std` (標準ライブラリ) の `Future` トレイトも同時にインポートされている場合、どちらの `poll` を呼ぶべきかが一意に決定できなくなり、コンパイルに失敗する可能性があります。 -そのため、Rust 2024 では新しい Prelude が導入されます。基本的な内容は現行のものと変わりませんが、以下の項目が追加されています: +そのため、Rust 2024 では新しいプレリュードが導入されます。基本的な内容は現行のものと変わりませんが、以下の項目が追加されています: -スコープ内にある二つのトレイトが同じメソッド名を持つ場合、どちらのトレイトメソッドを使うべきかがあいまいになってしまいます。例えば、次のコードをご覧ください。 +スコープ内にある二つのトレイトが同じメソッド名を持つ場合、どちらのトレイトメソッドを使うべきかが一意に決定できなくなってしまいます。例えば、次のコードをご覧ください。 ```rust,edition2021 trait MyPoller { @@ -119,7 +119,7 @@ fn main() { The [`rust_2024_prelude_collisions`] lint will automatically modify any ambiguous method calls to use fully qualified syntax. This lint is part of the `rust-2024-compatibility` lint group, which will automatically be applied when running `cargo fix --edition`. To migrate your code to be Rust 2024 Edition compatible, run: --> -また、[`rust_2024_prelude_collisions`] リントは、あいまいなメソッド呼び出しを自動的に完全修飾構文に変更してくれます。このリントは `rust-2024-compatibility` リントグループの一部であり、`cargo fix --edition` を実行すると自動的に適用されます。Rust 2024 エディションに互換性のあるコードに移行するには、次のコマンドを実行してください。 +また、[`rust_2024_prelude_collisions`] リントは、一意に決定できない曖昧なメソッド呼び出しを自動的に完全修飾構文に変更してくれます。このリントは `rust-2024-compatibility` リントグループの一部であり、`cargo fix --edition` を実行すると自動的に適用されます。Rust 2024 エディションに互換性のあるコードに移行するには、次のコマンドを実行してください。 ```sh cargo fix --edition From 80e2a92795f07dd8a8e16cbb7d52387d06d26c19 Mon Sep 17 00:00:00 2001 From: dyskinmel Date: Thu, 20 Feb 2025 16:31:02 -0600 Subject: [PATCH 04/10] =?UTF-8?q?=E3=83=AA=E3=83=B3=E3=82=AF=E3=82=92?= =?UTF-8?q?=E7=9B=B8=E5=AF=BE=E3=83=91=E3=82=B9=E3=81=8B=E3=82=89=E7=B5=B6?= =?UTF-8?q?=E5=AF=BE=E3=83=91=E3=82=B9=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rust-2024/prelude.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/rust-2024/prelude.md b/src/rust-2024/prelude.md index 4c6456f..2a9d703 100644 --- a/src/rust-2024/prelude.md +++ b/src/rust-2024/prelude.md @@ -18,8 +18,8 @@ - [`Future`] と [`IntoFuture`] トレイトがプレリュードに追加されました。 - その結果、一部のコードでトレイトメソッドの呼び出しが一意に決定できなくなり、コンパイルに失敗する可能性があります。 -[`Future`]: ../../std/future/trait.Future.html -[`IntoFuture`]: ../../std/future/trait.IntoFuture.html +[`Future`]: https://doc.rust-lang.org/std/future/trait.Future.html +[`IntoFuture`]: https://doc.rust-lang.org/std/future/trait.IntoFuture.html -[標準ライブラリのプレリュード](../../std/prelude/index.html) は、すべてのモジュールで自動的にインポートされる項目をまとめたモジュールです。例えば、`Option`、`Vec`、`drop`、`Clone` など、よく使われる項目が含まれます。 +[標準ライブラリのプレリュード](https://doc.rust-lang.org/std/prelude/index.html) は、すべてのモジュールで自動的にインポートされる項目をまとめたモジュールです。例えば、`Option`、`Vec`、`drop`、`Clone` など、よく使われる項目が含まれます。 # Prelude への変更点 ## 概要 - [`Future`] と [`IntoFuture`] トレイトがプレリュードに追加されました。 - その結果、一部のコードでトレイトメソッドの呼び出しが一意に決定できなくなり、コンパイルに失敗する可能性があります。 + + [`Future`]: https://doc.rust-lang.org/std/future/trait.Future.html [`IntoFuture`]: https://doc.rust-lang.org/std/future/trait.IntoFuture.html ## 詳細 [標準ライブラリのプレリュード](https://doc.rust-lang.org/std/prelude/index.html) は、すべてのモジュールで自動的にインポートされる項目をまとめたモジュールです。例えば、`Option`、`Vec`、`drop`、`Clone` など、よく使われる項目が含まれます。 @@ -40,46 +45,46 @@ The Rust compiler prioritizes any manually imported items over those from the pr to make sure additions to the prelude will not break any existing code. For example, if you have a crate or module called `example` containing a `pub struct Option;`, then `use example::*;` will make `Option` unambiguously refer to the one from `example`; -not the one from the standard library. +not the one from the standard library. --> Rust コンパイラは、Prelude からインポートされる項目よりも、明示的にインポートされた項目を優先します。たとえば、`example` というクレートやモジュールに `pub struct Option;` が定義されている場合、`use example::*;` とした場合、`Option` は標準ライブラリのものではなく `example` のものが使われます。 ただし、_トレイト_ をプレリュードに追加すると、既存のコードに微妙な影響が生じ壊れることがあります。たとえば、`MyPoller` というトレイトの `poll` メソッドを `x.poll()` と呼び出しているコードに、`std` (標準ライブラリ) の `Future` トレイトも同時にインポートされている場合、どちらの `poll` を呼ぶべきかが一意に決定できなくなり、コンパイルに失敗する可能性があります。 そのため、Rust 2024 では新しいプレリュードが導入されます。基本的な内容は現行のものと変わりませんが、以下の項目が追加されています: - 追加された項目: - [`std::future::Future`][`Future`] - [`std::future::IntoFuture`][`IntoFuture`] ## 移行 ### 競合するトレイトメソッド スコープ内にある二つのトレイトが同じメソッド名を持つ場合、どちらのトレイトメソッドを使うべきかが一意に決定できなくなってしまいます。例えば、次のコードをご覧ください。 @@ -103,7 +108,7 @@ fn main() { ``` これをすべてのエディションで正しく動作させるためには、完全修飾構文を使う必要があります。 @@ -116,8 +121,8 @@ fn main() { ``` - また、[`rust_2024_prelude_collisions`] リントは、一意に決定できない曖昧なメソッド呼び出しを自動的に完全修飾構文に変更してくれます。このリントは `rust-2024-compatibility` リントグループの一部であり、`cargo fix --edition` を実行すると自動的に適用されます。Rust 2024 エディションに互換性のあるコードに移行するには、次のコマンドを実行してください。 @@ -126,8 +131,8 @@ The [`rust_2024_prelude_collisions`] lint will automatically modify any ambiguou cargo fix --edition ``` - もしくは、完全修飾が必要な箇所を見つけるために、リントを手動で有効にすることもできます。 @@ -137,30 +142,8 @@ Alternatively, you can manually enable the lint to find places where these quali #![warn(rust_2024_prelude_collisions)] ``` - - -### `RustcEncodable` と `RustcDecodable` - - - -これらのシリアライズライブラリをまだ使用している場合は、別のライブラリへの移行を強く推奨します。 -しかし、これらの derive マクロは依然として標準ライブラリに含まれており、古い Prelude からインポートする必要があります: - -```rust,edition2021 -#[allow(soft_unstable)] -use core::prelude::v1::{RustcDecodable, RustcEncodable}; -``` - - -この変更に対する 自動移行手段はありません。そのため、手動で更新を行う必要があります。 - - [`rust_2024_prelude_collisions`]: https://doc.rust-lang.org/rustc/lints/listing/allowed-by-default.html#rust-2024-prelude-collisions \ No newline at end of file From 278db8b2456db12fb33fa6ef4f1de2af2d6409c9 Mon Sep 17 00:00:00 2001 From: dyskinmel <47494257+dyskinmel@users.noreply.github.com> Date: Tue, 25 Feb 2025 15:19:24 -0600 Subject: [PATCH 06/10] Update src/rust-2024/prelude.md Co-authored-by: TonalidadeHidrica <47710717+TonalidadeHidrica@users.noreply.github.com> --- src/rust-2024/prelude.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rust-2024/prelude.md b/src/rust-2024/prelude.md index 4c9fc52..815e91f 100644 --- a/src/rust-2024/prelude.md +++ b/src/rust-2024/prelude.md @@ -37,7 +37,7 @@ The [prelude of the standard library](../../std/prelude/index.html) is the modul It contains commonly used items such as `Option`, `Vec`, `drop`, and `Clone`. --> -[標準ライブラリのプレリュード](https://doc.rust-lang.org/std/prelude/index.html) は、すべてのモジュールで自動的にインポートされる項目をまとめたモジュールです。例えば、`Option`、`Vec`、`drop`、`Clone` など、よく使われる項目が含まれます。 +[標準ライブラリのプレリュード](https://doc.rust-lang.org/std/prelude/index.html)は、すべてのモジュールで自動的にインポートされるアイテムをまとめたモジュールです。例えば、`Option`、`Vec`、`drop`、`Clone` など、よく使われるアイテムが含まれます。 -Rust コンパイラは、Prelude からインポートされる項目よりも、明示的にインポートされた項目を優先します。たとえば、`example` というクレートやモジュールに `pub struct Option;` が定義されている場合、`use example::*;` とした場合、`Option` は標準ライブラリのものではなく `example` のものが使われます。 +Rust コンパイラは、プレリュードからインポートされるアイテムよりも、明示的にインポートされたアイテムを優先します。これにより、プレリュードに追加があっても既存のコードは壊れないようになっています。たとえば、`example` というクレートやモジュールに `pub struct Option;` が定義されている場合、`use example::*;` とした場合、`Option` は標準ライブラリのものではなく、必ず `example` のものが使われます。 -ただし、_トレイト_ をプレリュードに追加すると、既存のコードに微妙な影響が生じ壊れることがあります。たとえば、`MyPoller` というトレイトの `poll` メソッドを `x.poll()` と呼び出しているコードに、`std` (標準ライブラリ) の `Future` トレイトも同時にインポートされている場合、どちらの `poll` を呼ぶべきかが一意に決定できなくなり、コンパイルに失敗する可能性があります。 +ただし、*トレイト*をプレリュードに追加すると、既存のコードに微妙な影響が生じて壊れることがあります。たとえば、`MyPoller` というトレイトの `poll` メソッドを `x.poll()` と呼び出しているコードに、`std`(標準ライブラリ)の `Future` トレイトも同時にインポートされている場合、どちらの `poll` を呼ぶべきかが一意に決定できなくなり、コンパイルに失敗する可能性があります。 -これをすべてのエディションで正しく動作させるためには、完全修飾構文を使う必要があります。 +完全修飾構文を使うと、すべてのエディションで正しく動作するようになります。 ```rust,ignore fn main() { From 56f02514861fb79c02fcab3abb19ae01c5049ffb Mon Sep 17 00:00:00 2001 From: dyskinmel Date: Tue, 25 Feb 2025 15:31:00 -0600 Subject: [PATCH 10/10] =?UTF-8?q?=E3=82=B3=E3=83=BC=E3=83=89=E9=83=A8?= =?UTF-8?q?=E5=88=86=E3=81=AE=E7=BF=BB=E8=A8=B3=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rust-2024/prelude.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/rust-2024/prelude.md b/src/rust-2024/prelude.md index 2c1a0e7..f97e36c 100644 --- a/src/rust-2024/prelude.md +++ b/src/rust-2024/prelude.md @@ -89,6 +89,7 @@ When two traits that are in scope have the same method name, it is ambiguous whi スコープ内にある二つのトレイトが同じメソッド名を持つ場合、どちらのトレイトメソッドを使うべきかが一意に決定できなくなってしまいます。例えば、次のコードをご覧ください。 + + +```rust,edition2021 +trait MyPoller { + // この名前は、`std` の `Future` トレイトにある `poll` メソッドと同じです。 + fn poll(&self) { + println!("polling"); + } +} + +impl MyPoller for T {} + +fn main() { + // `Pin<&mut async {}>` は `std::future::Future` と `MyPoller` の両方を実装しています。 + // 両方のトレイトがスコープ内にある場合(Rust 2024 ではこれが発生する)、 + // どの `poll` メソッドを呼び出すかが曖昧になります。 + core::pin::pin!(async {}).poll(); +} +``` +```rust,ignore +fn main() { + // これで、どのトレイトのメソッドを参照しているのかが明確になりました。 + <_ as MyPoller>::poll(&core::pin::pin!(async {})); +} +``` + +```rust +// 手動で移行を行うには、クレートのルートにこれを追加してください。 +#![warn(rust_2024_prelude_collisions)] +```