Rust 的「标准库函数」层 = std 提供的自由函数与模块级函数(不是类型的方法)。这些函数散落在 std::mem / str / slice / num / cmp / convert / ptr 等模块,日常用得最多但常被忽略。
1. std::mem – 内存工具函数
描述
size_of/align_of 取类型尺寸、swap 交换、replace 替换并返回旧值、take 取走留默认、forget 跳过析构。
语法和示例
<code class="language-['mem::forget 会导致内存泄漏——只在你明确要转移所有权给外部时用', 'size_of::() 是编译期常量,可用于数组长度', 'replace 是「取出旧值并放入新值」的惯用法,常用于状态机切换', 'take 要求类型实现 Default']">use std::mem; mem::size_of::<u64>(); // 8 mem::align_of::<u64>(); // 8 let mut a = 1; let mut b = 2; mem::swap(&mut a, &mut b); // a=2, b=1 let old = mem::replace(&mut a, 9); // old=2, a=9 let taken = mem::take(&mut a); // taken=9, a=0(Default) mem::forget(Box::new(1)); // 跳过析构(泄漏) mem::discriminant(&Some(1)); // 取枚举变体标识
注意事项
- r
- u
- s
- t
2. std::str / &str 方法
描述
字符串切片的方法:trim/split/lines/parse/contains/replace/starts_with 等。注意很多按字节处理。
语法和示例
let s = " hi ";
s.trim(); // "hi"
s.trim_start_matches('/');
s.contains("hi"); s.starts_with(" ");
s.split(',').collect::<Vec<_>>();
s.lines().count();
"42".parse::<i32>()?; // Result
s.replace("i", "o");
s.char_indices().next(); // (0, ' ')
s.as_bytes(); s.to_uppercase();
format!("{:>8}|", s); // 宽度对齐注意事项
- r
- u
- s
- t
3. slice 方法 – 数组/切片操作
描述
chunks/windows/split_at/binary_search/sort/dedup 等。切片方法比 Vec 方法更通用(Vec 自动 deref)。
语法和示例
let mut v = [3, 1, 2, 2];
v.sort(); v.dedup(); // [1,2,3]
v.chunks(2); // [[1,2],[3]]
v.windows(2); // [[1,2],[2,3]]
v.split_at(2); // ([1,2],[3])
v.binary_search(&2); // Ok(索引) / Err(插入点)
v.contains(&2); v.iter().max();
let (a, b) = v.split_first().unwrap();
v.reverse(); v.rotate_left(1);
v.fill(0);注意事项
- r
- u
- s
- t
4. 数字方法 – 解析、转换与饱和运算
描述
parse/checked_/saturating_/wrapping_/overflowing_ 四套算术:溢出时分别 panic/None/截断/回绕。
语法和示例
let n: i32 = "42".parse().unwrap();
(255u8).checked_add(1); // None
(255u8).saturating_add(1); // 255
(255u8).wrapping_add(1); // 0
(255u8).overflowing_add(1); // (0, true)
(2.5f64).floor(); (2.5).round();
(-7i32).div_euclid(2); // -4(欧几里得除)
(-7i32).rem_euclid(2); // 1
i32::from_str_radix("ff", 16);注意事项
- r
- u
- s
- t
5. std::cmp – 比较与排序
描述
min/max/clamp 自由函数、Ordering 枚举、Reverse 包装反转排序。
语法和示例
use std::cmp::{min, max, Ordering, Reverse};
min(3, 5); max(3, 5); 3.clamp(1, 10);
a.cmp(&b); // Ordering
v.sort_by(|a, b| b.cmp(a)); // 降序
v.sort_by_key(|x| Reverse(x.0)); // 用 Reverse 包装
v.max_by_key(|x| x.score);
// 自定义全序
#[derive(PartialEq)]
struct P(f64);
impl Eq for P {}
impl PartialOrd for P { fn partial_cmp(&self, o: &Self) -> Option<Ordering> { Some(self.cmp(o)) } }
impl Ord for P { fn cmp(&self, o: &Self) -> Ordering { self.0.total_cmp(&o.0) } }注意事项
- r
- u
- s
- t
6. std::convert – 类型转换函数
描述
identity 返回自身、Into/From/TryFrom 的调用形态、as 强转与 FromStr。
语法和示例
let n: u64 = 42u32.into(); // Into
let s = String::from("x"); // From
let n: i64 = 100i32.into();
"42".parse::<i32>(); // FromStr
let small = i32::try_from(300i64); // Result(可能溢出)
let f = 1.5f64 as i32; // as 强转(截断,不检查)
std::convert::identity(x); // 返回自身(函数式占位)注意事项
- r
- u
- s
- t
7. std::ptr – 裸指针(unsafe)
描述
null/null_mut 构造空指针、read/write 读写、as_ref 转引用、swap_nonoverlapping。
语法和示例
use std::ptr;
let p: *const i32 = ptr::null();
if !p.is_null() { unsafe { println!("{}", *p); } }
let mut x = 5;
let mp: *mut i32 = &mut x;
unsafe { *mp = 6; }
unsafe { ptr::write(mp, 7); }
unsafe { ptr::read(mp); }
// 空指针检查
std::ptr::NonNull::<i32>::new(&mut x);
// 引用与指针的常见转换
let x = 5;
let r: &i32 = &x;
let raw: *const i32 = r as *const i32;
unsafe { assert_eq!(*raw, 5); }
let nr = std::ptr::NonNull::from(&x);
注意事项
- r
- u
- s
- t
8. std::any – 运行时类型判断
描述
type_id 取类型标识、downcast_ref 向下转型、is 判断类型。用于 Box 场景。
语法和示例
use std::any::{Any, TypeId};
let b: Box<dyn Any> = Box::new(42i32);
b.downcast_ref::<i32>(); // Some(&42)
b.is::<i32>(); // true
TypeId::of::<i32>();
// 日志/插件的动态分发
fn log(x: &dyn Any) {
if let Some(n) = x.downcast_ref::<i32>() { println!("{n}") }
}注意事项
- r
- u
- s
- t
9. std::io – 输入输出函数
描述
stdin/stdout 读写、read_line、copy、Write trait 的 flush/write_all。
语法和示例
use std::io::{self, Read, Write};
let mut buf = String::new();
io::stdin().read_line(&mut buf)?;
io::stdout().write_all(b"hi")?;
io::stdout().flush()?;
// 读整个 stdin
let mut all = String::new();
io::stdin().read_to_string(&mut all)?;
// 拷贝
let mut src = io::stdin();
io::copy(&mut src, &mut io::stdout())?;
// 分块读写的常用组合
use std::io::{BufRead, BufReader};
let f = std::fs::File::open("a.txt")?;
let reader = BufReader::new(f);
for line in reader.lines() { println!("{}", line?); }
注意事项
- r
- u
- s
- t
10. std::env – 环境与参数函数
描述
args/args_os/var/var_os/vars/current_dir/set_current_dir/temp_dir。
语法和示例
let args: Vec<String> = std::env::args().skip(1).collect();
std::env::var("HOME").unwrap_or_default();
std::env::vars().filter(|(k, _)| k.starts_with("APP_"));
std::env::current_dir()?;
std::env::temp_dir();
std::env::consts::OS; // "linux" / "windows"
std::env::consts::ARCH;
// 参数解析建议用 clap(标准库只有 args)注意事项
- r
- u
- s
- t
11. std::process / std::thread 函数
描述
Command 构造子进程、exit 退出、thread::sleep/yield_now/scope 线程工具。
语法和示例
use std::process::{Command, exit};
let out = Command::new("git").arg("status").output()?;
out.status.success();
exit(1);
use std::thread;
thread::sleep(std::time::Duration::from_millis(100));
thread::yield_now(); // 让出 CPU
thread::available_parallelism()?; // 逻辑核数
thread::scope(|s| { s.spawn(|| work()); });注意事项
- r
- u
- s
- t
这个系列的其他文档
- Rust 关键字与语法详解——关键字与语法
- Rust 标准库详解——标准库模块
- 完整学习路线——按顺序学完这个系列
- 返回 Rust 总览——本语言三层字典的入口页