You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Rust模式匹配中,能否创建可变引用的可变值?

Rust可变引用在模式匹配中的正确用法

嘿,我来帮你搞定这个Rust里的可变引用问题~

首先咱们先拆解你遇到的错误:你写的代码里,ref mut s已经帮你拿到了指向score内部值的可变引用,但你后面写&mut s是画蛇添足了,而且触发了错误。

错误原因分析

先看你的代码:

let mut score = Some(42);
if let Some(ref mut s) = score {
    &mut s; // 这里出错
}

当你用ref mut s时,s的类型是&mut i32——它本身是一个不可变的变量(你不能给s重新赋值成另一个引用),但它指向的内存区域是可变的。你试图写&mut s,本质是想对s这个变量本身取可变引用,但s本身是不可变绑定,所以Rust报错了。

正确的写法

你根本不需要&mut s,直接通过解引用操作s指向的内容就行:

let mut score = Some(42);
if let Some(ref mut s) = score {
    // 解引用修改内部值
    *s += 10;
    println!("修改后的分数:{}", *s); // 输出 52
}
// 这里score还是Some(52),因为我们只是借用了引用,没有移动值

关于mut ref mut s的问题

你尝试加另一个mut的写法if let Some(mut ref mut s) = score是不符合Rust语法的,完全没必要。这里分两种场景:

  1. 如果你想借用内部值的可变引用(不拿走所有权):用ref mut s就足够了,如上面的示例。
  2. 如果你想拿走内部值的所有权并修改:直接用mut s(不需要ref):
let mut score = Some(42);
if let Some(mut s) = score {
    s += 10;
    println!("修改后的分数:{}", s); // 输出 52
}
// 注意:这里score已经变成None了,因为内部的i32被移动走了

核心要点总结

  • ref mut s得到的是指向内部值的可变引用,变量s本身不可变,但它指向的内容可以通过*s修改。
  • 不要对s再使用&mut,因为s已经是&mut T类型了。
  • 区分“借用引用”和“获取所有权”两种场景,选择对应的模式匹配写法。

内容的提问来源于stack exchange,提问作者Shepmaster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:46:43