结论:Rust 刻意取消了 null,用 Option<T> 枚举(Some(T) / None)表达"值可能不存在"。空值的可能性被编码进类型系统,编译器强制调用方显式处理 None 分支,从语言层面消灭了空指针解引用这类运行时崩溃。

展开:关键区别在于"可空性是否显式"。C/Java 中任何指针/引用都可能为 null,检查靠自觉;Rust 中 String 保证非空,可能为空的地方类型签名就是 Option<String>,不解包就拿不到里面的值。常用处理手法:matchif letunwrap_or / unwrap_or_elsemap / and_then 链式组合、? 运算符向上传播。性能上无额外成本:Option<&T>Option<Box<T>> 等借助 niche 优化与 T 本身占同样大小(空指针即 None)。易错点:不要在库代码里用 unwrap() 处理 None,panic 会把可恢复错误变成进程崩溃。

fn first_even(v: &[i32]) -> Option<i32> {
    v.iter().copied().find(|x| x % 2 == 0)
}
let r = first_even(&[1, 3]).unwrap_or(-1); // None → -1

追问方向:ResultOption 的分工、空对象模式为何在 Rust 中不流行。