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

Rust中Vector的借用疑问:非借用与借用差异及元素修改方法

Rust代码问题解答

先贴出原代码:

fn main() {
    let mut numbers = vec![1, 3, 5, 2, 8, 1];

    // 1 - non-borrow
    let mut largest = numbers[0];
    largest = 20;

    println!("{} {}", numbers[0], largest);

    // 2 - borrow
    let mut largest = &numbers[0];
    largest = &30;

    println!("{} {}", numbers[0], largest);
}

问题解答

1. 非借用操作与借用操作的区别,仅影响类型吗?

不止是类型区别,核心是所有权与值的独立性:

  • 非借用:let mut largest = numbers[0];是把numbers[0]的值拷贝给largest,此时largest是独立的i32变量,拥有自身所有权。修改largest只会改变这个变量本身,完全不影响原vector里的元素,原numbers[0]始终是1。
  • 借用:let mut largest = &numbers[0];是创建指向numbers[0]的不可变引用,largest类型为&i32,它不拥有值的所有权,只是借用原值的访问权。这段代码里后续把largest重新绑定到&30,本质是更换了引用的目标,也没修改原vector,但如果用可变引用,就能直接操作原vector的元素。

2. 为何largest需要借用字面量值?

因为largest的类型是&i32(不可变引用),Rust要求赋值时类型必须严格匹配。字面量30的类型是i32,直接赋值会触发类型不匹配的编译错误,所以必须用&30将其转换为&i32类型的引用。Rust会自动把字面量存入静态内存区域,&30是合法的静态生命周期引用,可以安全赋值。

3. 是否可实际引用Vector中的第一个值并对其进行修改?

可以,但需要使用可变引用,同时遵循Rust的借用规则。修改后的示例代码:

fn main() {
    let mut numbers = vec![1, 3, 5, 2, 8, 1];
    // 创建可变引用
    let largest = &mut numbers[0];
    // 通过解引用操作修改原vector的元素
    *largest = 30;
    println!("{}", numbers[0]); // 输出30
}

注意:同一时间只能存在一个可变引用,或者多个不可变引用,不能同时存在可变和不可变引用,这是Rust保证内存安全的核心规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:15:37