前奏曲的添加

🚧 2024 版本尚未发布,因此本节仍在“建设中”。更多信息可以在跟踪问题中找到:https://github.com/rust-lang/rust/issues/121042

总结

  • FutureIntoFuture 特征现在是前奏曲的一部分。
  • 这可能会导致对特征方法的调用产生歧义,从而导致某些代码无法编译。
  • RustcEncodableRustcDecodable 已从前奏曲中移除。

详情

标准库的前奏曲 是包含每个模块中自动导入的所有内容的模块。它包含常用的项目,例如 OptionVecdropClone

Rust 编译器优先考虑任何手动导入的项目,而不是前奏曲中的项目,以确保对前奏曲的添加不会破坏任何现有代码。例如,如果您有一个名为 example 的 crate 或模块,其中包含 pub struct Option;,则 use example::*; 将使 Option 明确地引用 example 中的 Option,而不是标准库中的 Option

但是,向前奏曲添加特征可能会以一种微妙的方式破坏现有代码。例如,如果也导入了 stdFuture,则对 x.poll() 的调用(来自 MyPoller 特征)可能会编译失败,因为对 poll 的调用现在是模棱两可的,可以来自任何一个特征。

作为解决方案,Rust 2024 将使用新的前奏曲。它与当前的前奏曲相同,但有以下更改

RustcEncodableRustcDecodable 移除

RustcEncodableRustcDecodable 是两个未记录的派生宏,已从前奏曲中移除。这些在 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 {}));
}

RustcEncodableRustcDecodable

强烈建议您迁移到其他序列化库,如果您仍在使用这些库。但是,这些派生宏在标准库中仍然可用,只是现在需要从旧的前奏曲中导入它们

#![allow(unused)]
fn main() {
#[allow(soft_unstable)]
use core::prelude::v1::{RustcDecodable, RustcEncodable};
}