【rust】Rust 默认引用 std::prelude

读音与词义

prelude 的读音:英式/美式均为 /ˈprel.juːd/("prel-yood")

含义 :名词,意为"序曲、前奏、序幕"。在编程语言中,指自动导入的预定义模块,为代码提供开箱即用的常用功能。

详细说明

自动导入

在 Rust 2024 版本中,每个模块都会自动导入:

rust 复制代码
use std::prelude::rust_2024::*;

这意味着你可以直接使用 prelude 中定义的类型、trait 和函数,无需显式导入。

Prelude 包含的内容

std::prelude 主要包含:

常见类型:

  • String, Vec, Option, Result
  • Box, Cow, Slice

重要 trait:

类别 trait
转换相关 AsRef, AsMut, Into, From
标记 trait Send, Sync, Sized
内存与复制 Clone, Copy, Drop
格式化与默认 Default, Debug
闭包 Fn, FnMut, FnOnce
迭代器 Iterator, DoubleEndedIterator, ExactSizeIterator
异步 (2024 新增) Future, IntoFuture

常用宏:

  • println!, format!, vec!, assert!

示例对比

rust 复制代码
// 不需要这样写:
// use std::option::Option;
// use std::vec::Vec;
// use std::string::String;
// use std::boxed::Box;
// use std::future::Future;  // 2024 版本中也不需要显式导入

fn main() {
    // 可以直接使用,因为已经在 prelude 中
    let v: Vec<i32> = vec![1, 2, 3];
    let s = String::from("hello");
    let o: Option<i32> = Some(42);
    let b = Box::new(5);
    
    println!("{}", s);
}

禁用 Prelude

如果需要避免自动导入(例如在 no_std 环境中),可以使用 #![no_implicit_prelude] 属性:

rust 复制代码
#![no_implicit_prelude]
// 现在必须显式导入所有内容
extern crate std;
use std::prelude::rust_2024::*;

各版本对应关系

Rust 版本 默认导入的 prelude
Rust 2015 std::prelude::v1
Rust 2018 std::prelude::rust_2018
Rust 2021 std::prelude::rust_2021
Rust 2024 std::prelude::rust_2024

2024 版本特别说明

Rust 2024 Edition 在 prelude 中新增了 FutureIntoFuture 两个异步 trait,这意味着异步编程时无需显式导入这些核心 trait。

升级注意事项 :由于 Future 被加入 prelude,如果代码中存在与 poll 方法同名的方法,可能会产生歧义。运行以下命令可自动修复:

bash 复制代码
cargo fix --edition

注意

  • no_std 环境中,只有 core::prelude 会被导入
  • 不同 Rust Edition 的 prelude 内容可能略有差异,2024 版本是最新标准
相关推荐
Rust研习社11 小时前
组合真的优于继承吗?为什么 Rust 和 Go 都拥抱组合舍弃继承?
后端·rust·编程语言
红尘散仙2 天前
想写一个像样的终端 App?试试把 React 的开发体验搬进 Rust TUI
前端·rust
vivo互联网技术2 天前
从 Web 到桌面:基于 Tauri 2.0 + Vue 3 打造 vivo 线下门店「大头贴」拍照体验系统
前端·rust
Rust研习社2 天前
这 8 个 Rust 学习资源值得每个新手收藏起来
后端·rust·编程语言
星栈3 天前
10 分钟跑起第一个 Dioxus 应用:`dx` CLI、`rsx!` 和热更新好不好用
前端·rust·前端框架
望眼欲穿的程序猿3 天前
读取芯片内部温度传感器
嵌入式硬件·rust
望眼欲穿的程序猿3 天前
ADC 模拟电压采集
嵌入式硬件·rust
codexu_4612291873 天前
NoteGen 里一条记录如何变成 Markdown
前端·笔记·rust·tauri
Rust研习社3 天前
Rust 错误处理的黄金搭档:一个定义错误,一个传播错误
后端·rust·编程语言
techdashen3 天前
绕过系统 ICMP:用 rawsock、Npcap 和 WMI 找到默认网卡
开发语言·arm开发·rust