前奏曲的添加
🚧 2024 版本尚未发布,因此本节仍在“建设中”。更多信息可以在跟踪问题中找到:https://github.com/rust-lang/rust/issues/121042。
总结
Future
和IntoFuture
特征现在是前奏曲的一部分。- 这可能会导致对特征方法的调用产生歧义,从而导致某些代码无法编译。
RustcEncodable
和RustcDecodable
已从前奏曲中移除。
详情
标准库的前奏曲 是包含每个模块中自动导入的所有内容的模块。它包含常用的项目,例如 Option
、Vec
、drop
和 Clone
。
Rust 编译器优先考虑任何手动导入的项目,而不是前奏曲中的项目,以确保对前奏曲的添加不会破坏任何现有代码。例如,如果您有一个名为 example
的 crate 或模块,其中包含 pub struct Option;
,则 use example::*;
将使 Option
明确地引用 example
中的 Option
,而不是标准库中的 Option
。
但是,向前奏曲添加特征可能会以一种微妙的方式破坏现有代码。例如,如果也导入了 std
的 Future
,则对 x.poll()
的调用(来自 MyPoller
特征)可能会编译失败,因为对 poll
的调用现在是模棱两可的,可以来自任何一个特征。
作为解决方案,Rust 2024 将使用新的前奏曲。它与当前的前奏曲相同,但有以下更改
- 添加
- 移除
RustcEncodable
RustcDecodable
RustcEncodable
和 RustcDecodable
移除
RustcEncodable
和 RustcDecodable
是两个未记录的派生宏,已从前奏曲中移除。这些在 Rust 1.0 之前已被弃用,但仍保留在标准库前奏曲中。2024 版本已将这些从前奏曲中移除,因为预计不会使用它们。
如果在不太可能的情况下,仍然有项目使用这些,建议切换到序列化库,例如在 crates.io 上找到的那些。
迁移
🚧 此功能的自动迁移尚未实现。
需要迁移
冲突的特征方法
当作用域中的两个特征具有相同的 方法名称时,应该使用哪个特征方法是模棱两可的。例如
trait MyPoller { // This name is the same as the `poll` method on the `Future` trait from `std`. fn poll(&self) { println!("polling"); } } impl<T> 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(); }
我们可以通过使用完全限定语法来解决这个问题
fn main() {
// Now it is clear which trait method we're referring to
<_ as MyPoller>::poll(&core::pin::pin!(async {}));
}
RustcEncodable
和 RustcDecodable
强烈建议您迁移到其他序列化库,如果您仍在使用这些库。但是,这些派生宏在标准库中仍然可用,只是现在需要从旧的前奏曲中导入它们
#![allow(unused)] fn main() { #[allow(soft_unstable)] use core::prelude::v1::{RustcDecodable, RustcEncodable}; }