
Rust 1.95 将从主分支于今天——2 月 27 日分叉,目标是在 4 月 16 日发布稳定版本。Rust 1.95 稳定化了 if let guards 语法,将一些移植更改为第二级别状态,以及各种其它更改。
需要特别标出的是,可以说 Rust 1.95 这个版本,也是主要为 Linux 7.0 发出的修复程序。自 Linux 内核正式接纳 Rust 后,这应该还是首次(参见《Linux 7.0 合并窗口开启,Rust 正式成为内核“一等公民”:百万台 Android 设备已尝鲜》)。
其它信息算新闻,唯独看到 if let guards 语法稳定,激发了我的分享欲望……

在此之前——如果你也使用的是 nightly 版本——肯定关心以下几个让人迷惑的点——
1、Rust 1.95 nightly 今天才分叉?我好多天前的 nightly 版本都是 1.95 了
你说的没错,Rust 1.95-nightly 这个标签号,我至少 2 月 23 日就更新到了。

我虽然使用的是 nightly 版本,但更新频率一般(使用 nightly 版本主要是为了嵌入式开发支持——micro:bit 和 arduino 有些情况下需要,以及性能),所以可能 Rust 1.95-nightly 这个标签号早就有了,但我没去查最早那天产生的。
但今天(2026-02-27)这个 1.95.0-nightly 版本标签号,才是未来 1.95 稳定版的功能——版本号与内容才终于匹配。
2、if let guards 语法是 Rust 1.95 新增代码?新增功能?1.95 之前不能用?
不是新增代码,实际代码产生很早,是 2020 年 12 月……

那是新增功能?对于仅使用 stable 版本而言,是的——4 月 16 日的 1.95-stable 就可以直接使用这个语法了。
但对于 nightly 版本,不是,因为上面说了,2020 年 12 月就可以用啦——使用功能门(Feature Gate)或功能标志(Feature Flag)即可。
#![feature(if_let_guard)]
其核心价值在于:让你在 if let 的条件中,像使用 match 守卫一样,写出更复杂的模式匹配逻辑。
以上文字,皆为啰嗦,我们看看实际怎么用,带来了什么简洁性。
基础语法:从 match 到 if let
在 Rust 1.95 之前,如果你想在 if let 中对绑定的值做进一步检查,通常得用嵌套的 if:
#![feature(if_let_guard)]
enum Temperature {
Celsius(i32),
Fahrenheit(i32),
}
let value = Temperature::Celsius(25);
// Rust 1.95 之前:必须嵌套 if
if let Temperature::Celsius(c) = value {
if c > 20 {
println!("{}°C 是温暖的", c);
}
}
// Rust 1.95 + if let guards:条件写在一起,更清晰
if let Temperature::Celsius(c) = value && c > 20 {
println!("{}°C 是温暖的", c);
}场景一:处理嵌套的 Option
这是新语法最实用的场景之一。当你从多个 Option 中取值,并对值进行判断时,代码会变得非常简洁:
#![feature(if_let_guard)]
fn process_user_preferences(theme: Option<&str>, notifications: Option<bool>) {
// 旧写法:层层嵌套
if let Some(t) = theme {
if t == "dark" {
if let Some(n) = notifications {
if n {
println!("暗黑模式,通知开启 (旧写法)");
}
}
}
}
// 新写法:条件链一目了然
if let Some(t) = theme && t == "dark" && let Some(n) = notifications && n {
println!("暗黑模式,通知开启 (新写法)");
}
}场景二:多条件组合与守卫
你可以把模式匹配和守卫条件(guard)任意组合,这在处理复杂业务逻辑时特别有用 :
#![feature(if_let_guard)]
enum ApiResponse {
Success { data: Vec<u8>, cached: bool },
Error { code: u16, message: String },
Timeout,
}
fn handle_response(resp: ApiResponse) {
// 同时检查:数据长度 > 100 且来自缓存
if let ApiResponse::Success { data, cached } = resp && data.len() > 100 && cached {
println!("收到大量缓存数据,长度:{}", data.len());
}
// 用守卫检查错误码范围
if let ApiResponse::Error { code, message } = resp && (400..=499).contains(&code) {
println!("客户端错误 {}: {}", code, message);
}
}场景三:与 let else 配合的流畅控制流
if let guards 可以和 let else 无缝配合,让整个函数的控制流保持线性,告别嵌套 :
#![feature(if_let_guard)]
struct Config {
host: Option<String>,
port: Option<u16>,
tls: bool,
}
fn build_endpoint(config: Config) -> Option<String> {
// 先校验必要字段,不符合直接返回
let Some(host) = config.host else { return None };
let Some(port) = config.port else { return None };
// 用 if let guard 进行精细化处理
if let Some(port) = Some(port) && port == 443 {
return Some(format!("https://{}", host));
}
if config.tls {
Some(format!("https://{}:{}", host, port))
} else {
Some(format!("http://{}:{}", host, port))
}
}就这些,可以看到,新写法优势明显——
谢谢您的阅读,欢迎交流。如果您发现错别字,也请向我发信息。