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

请教Rust中“无法对只读值借用可变引用”的含义及示例

关于Rust中“无法对只读值借用可变引用”规则的解释与示例

这条规则是Rust借用检查器的核心约束,目的是维护内存安全与变量语义的一致性:

  • 若一个值是只读绑定(比如用let x = ...声明而非let mut x = ...),或是本身不可变的常量(如字符串字面量),Rust禁止为其创建可变引用(&mut T)。
  • 核心逻辑是:只读值的语义是“不会被修改”,允许可变引用会直接打破这个约定,导致代码行为不可预测,同时也会和Rust的独占性借用规则冲突。

错误示例:违反规则的场景

场景1:对只读绑定的变量尝试可变引用

fn main() {
    let x = 5; // 只读绑定,x不可变
    let y = &mut x; // 编译报错:无法将`x`借用为可变,因为它未被声明为mut
}

场景2:对不可变字面量尝试可变引用

fn main() {
    let s = "hello"; // 字符串字面量是不可变的&str
    let s_mut = &mut s; // 编译报错:无法借用不可变局部变量`s`为可变
}

场景3:对只读绑定的可变结构尝试可变引用

即使值的内部是可变类型(比如Vec<T>),只要绑定是只读的,依然无法创建可变引用:

fn main() {
    let v = vec![1, 2, 3]; // 只读绑定的Vec
    let v_mut = &mut v; // 编译报错:无法借用`v`为可变,因为它未被声明为mut
}

正确示例:合法创建可变引用的场景

只有当值的绑定是可变的(用let mut声明),才能为其创建可变引用:

fn main() {
    let mut x = 5;
    let y = &mut x;
    *y += 1;
    println!("x: {}", x); // 输出:x: 6
}

针对可变结构的正确用法:

fn main() {
    let mut v = vec![1, 2, 3];
    let v_mut = &mut v;
    v_mut.push(4);
    println!("{:?}", v); // 输出:[1, 2, 3, 4]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:25:35